2011-02-10 14 views
5

Potrzebuję ustawić datę ostatniej modyfikacji dla niektórych plików. Jest to niezbędna umiejętność dla mojej aplikacji.setLastModified date with Qt

Nie widzę, jak mogę to zrobić z QT. Nie widzę dla niego metody/funkcji. Mogę odczytać daty z Qt, ale nie widzę sposobu, w jaki mogę ustawić daty.

Teraz ... Wiem, że niektóre (tak naprawdę wszystkie) Windows API z MS mają tę zdolność.

Chodzi o to, że nie szukam rozwiązania "tylko dla systemu Windows". Potrzebuję tej umiejętności do pracy w systemach Windows, Linux i Mac. Właśnie dlatego wybieram Qt ...

Każde zaproponowane rozwiązanie powinno być oparte na API (nie chcę polecenia/narzędzia systemowego), a rozwiązanie powinno obejmować 3 główne systemy operacyjne (Win, Linux, Mac).

+0

Znalazłeś rozwiązanie? Mam ten sam problem. Czy to możliwe za pomocą Qt ?. Dzięki –

Odpowiedz

3

Funkcja posix do tego celu to utime(2), która jest również dostępna w oknach jako część MSVCRT (patrz MSDN). Używanie tego powinno dotyczyć komputerów Mac, Linux i Windows.

Ponieważ QAbstractFileEngine nie ujawnia tej funkcji, nie sądzę, że będzie ona dostępna również w innych interfejsach API systemu plików Qt.

3

Nie sądzę, że jest coś konkretnego. Najprostszym sposobem jest prawdopodobnie otwarcie pliku do zapisu + dopisz i zamknij go ponownie - dzięki temu system operacyjny/system plików zaktualizuje zmodyfikowany czas.

Można również spróbować odczytać uprawnienia i wywoływać funkcję setPerimssions, która jest czasami używana jako bezpieczniejszy sposób aktualizowania pliku, ponieważ nie jest on blokowany.

edytuj: aby ustawić dowolny czas ostatniej modyfikacji - w przypadku funkcji Windows SetFileTime.

Masz migre boost::filesystem::last_write_time(), na które chcesz spojrzeć - nie użyłem go.

+0

To by nie działało w ogóle. Jeśli dateTime jest teraz B, kopiuję plik, który był ostatnio modyfikowany w dniu Godzina A, kopia zmieni się na dateTime z B. W dół drogi, w miarę upływu czasu, dateTime będzie C. Jeśli w tym czasie otworzę i zapiszę plik jak sugerujesz, będzie to ostatnia modyfikowana dataTime of C. Oczywiście jest to bezsensowne, ponieważ lastModified dataTime będzie jeszcze bardziej "wyłączone", ponieważ potrzebuję go A, a nie C. Potrzebuję ostatniej zmodyfi- kowanej dateTime, aby była taka sama jak oryginalny plik. – user440297

+0

Przepraszam? - Ustawiłeś ostatnio czas modyfikacji na "teraz" i robisz to, modyfikując plik "teraz"! –

+0

Nie chcę ustawić czasu ostatniej modyfikacji na "teraz". Dlatego to, co sugerujesz, nie zadziała. Wszystkie MS API pozwalają na ustawienie znaczników czasu pliku podobnie jak Java i inne dojrzałe API. Qt może uzyskać znaczniki czasu, ale nie może ustawić znaczników czasu, o ile wiem. Jeśli będę musiał, użyję WinAPI, ale to pozostawi mnie w ciemności w odniesieniu do Linuksa i MAC. – user440297

3

W oknach to qt_windows.h i graj z datą modyfikacji i tworzenia.

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); 

dla Linux dodatku obejmują utime.h i fcntl.h następnie

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 nazwa pliku = nazwa pliku.toStdWString().c_str(); 'jest bardzo złą radą, ponieważ' filename' będzie przechowywać wskaźnik do usuniętego obiektu tymczasowego – borisbn