2011-02-10 9 views
5

È necessario impostare l'ultima data di modifica per alcuni file. È un'abilità essenziale per la mia applicazione.setLastData modificata con Qt

Non vedo come posso farlo con QT. Non vedo un metodo/funzione per questo. Posso leggere le date con Qt ma non vedo come posso impostare le date.

Ora ... So che alcune (penso che tutte in realtà) le API di Windows di MS hanno questa capacità.

Il fatto è che non sto cercando una soluzione "Windows". Ho bisogno di questa capacità per lavorare su Windows, Linux e Mac. Ecco perché scelgo Qt ...

Qualsiasi soluzione proposta dovrebbe essere API centrica (non voglio un comando/utilità di sistema) e la soluzione dovrebbe coprire i 3 sistemi operativi principali (Win, Linux, Mac).

+0

Hai trovato una soluzione? Ho lo stesso problema. È possibile utilizzare Qt ?. Grazie –

risposta

3

La funzione posix per questo è utime(2), che è disponibile anche su Windows come parte di MSVCRT (vedere MSDN). Quindi usare quello dovrebbe coprire Mac, Linux e Windows.

Poiché QAbstractFileEngine non espone questa funzionalità, non penso che sarà disponibile in nessun'altra API del filesystem Qt.

3

Non penso che ci sia qualcosa di specifico. Il modo più semplice è probabilmente aprire il file per scrivere + append e chiuderlo di nuovo - questo consente al sistema operativo/al filesystem di aggiornare il tempo modificato.

Si potrebbe anche provare a leggere le autorizzazioni e chiamare setPerimssions, che a volte viene utilizzato come un modo più sicuro di aggiornare un file poiché non è bloccante.

modifica: per impostare un tempo arbitrario dell'ultima modifica che è possibile utilizzare - su windows SetFileTime.

C'è uno boost::filesystem::last_write_time() che vuoi guardare - Non l'ho usato.

+0

Questo non funzionerebbe affatto. Se dateTime ora è B, copio un file che è stato modificato l'ultima volta alla dataTime A, la copia avrà modificato la dataTime di B. In fondo alla strada, col passare del tempo, dateTime sarà C. Se in quel momento apro e salvo il file come suggerisci che avrà una data di ultima modificaTime di C. Ovviamente questo è inutile dato che l'ultimo dato DataTime sarà ancora più "off" perché ho bisogno che sia A e non C. Ho bisogno dell'ultima DataTempo modificato per essere uguale al file originale. – user440297

+0

Siamo spiacenti? - imposta l'ora dell'ultima modifica su "now" e lo fai modificando il file "now"! –

+0

Non voglio impostare l'ora dell'ultima modifica su "adesso". Quindi, quello che suggerisci non funzionerà. Tutte le API MS consentono l'impostazione di timestamp di file come Java e altre API mature. Qt può ottenere timestamp ma non posso impostare timestamp per quanto ne so. Se devo usare il WinAPI, ma questo mi lascia al buio per quanto riguarda Linux e MAC. – user440297

3

Nelle finestre include qt_windows.h e gioca con la data di modifica e di creazione.

QDateTime newModifiedTime=ui->dateTimeEdit_modified->dateTime(); 
QDateTime newCreationDate=TimeEdit_Creation->dateTime(); 
FILETIME pmodifiedtime,pcreationtime; 
    HANDLE hfile; 
    LPCWSTR filename=Filename.toStdWString().c_str(); 
      hfile=CreateFile(filename,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
    if(hfile==INVALID_HANDLE_VALUE) 
    { 
     QMessageBox::information(this,"Failed","Unable to open file,check file permission"); 
    } 
    else 
    { 
     LONGLONG ll = Int32x32To64(newCreationDate.toTime_t(), 10000000) + 116444736000000000; 
     pcreationtime.dwLowDateTime = (DWORD) ll; 
     pcreationtime.dwHighDateTime = ll >> 32; 
     LONGLONG ll2 = Int32x32To64(newModifiedTime.toTime_t(), 10000000) + 116444736000000000; 
     pmodifiedtime.dwLowDateTime = (DWORD) ll2; 
     pmodifiedtime.dwHighDateTime = ll2 >> 32; 

     if(!SetFileTime(hfile,&pcreationtime,NULL,&pmodifiedtime)) 
     { 
      QMessageBox::information(this,"Failed","Unable to set Date And Time"); 
     } 
     else 
     { 
      QMessageBox::information(this,"Success","Date And Time Updated"); 
      ui->lineEdit_FileName->clear(); 
     } 
    } 
    CloseHandle(hfile); 

For linux add includono utime.h e fcntl.h poi

struct utimbuf timebuffer; 
timebuffer.modtime=newModifiedTime.toTime_t(); 
const char *filename=Filename.toAscii(); 
if((utime(filename,&timebuffer))<0) 
{ 
     QMessageBox::information(this,"Error","Unable to set Time"); 
} 
else 
{ 
     QMessageBox::information(this,"Success","Date Changed"); 
} 
+2

'LPCWSTR nomefile = Nomefile.toStdWString().c_str(); 'è un pessimo consiglio, perché' filename' memorizzerà il puntatore su un oggetto temporaneo eliminato – borisbn