2011-02-10 36 views
5

Tôi cần đặt ngày sửa đổi cuối cùng cho một số tệp. Đó là một khả năng thiết yếu cho ứng dụng của tôi.setLastModified date with Qt

Tôi không thấy cách tôi có thể thực hiện điều này với QT. Tôi không thấy một phương pháp/chức năng cho nó. Tôi có thể đọc các ngày có Qt nhưng tôi không thấy cách tôi có thể đặt ngày.

Bây giờ ... Tôi biết một số (tôi nghĩ tất cả thực sự) cửa sổ API của MS có khả năng này.

Điều này là tôi không tìm kiếm giải pháp "Windows" duy nhất. Tôi cần khả năng này để làm việc trên Windows, Linux và Mac. Đây là lý do tại sao tôi chọn Qt ...

Bất kỳ giải pháp nào được đề xuất nên là trung tâm API (không muốn lệnh/tiện ích hệ thống) và giải pháp bao gồm 3 hệ điều hành chính (Win, Linux, Mac).

+0

Bạn đã tìm thấy một giải pháp? Tôi có cùng một vấn đề. Có thể sử dụng Qt ?. Cảm ơn –

Trả lời

3

Chức năng posix cho điều này là utime(2), cũng có sẵn trên các cửa sổ như một phần của MSVCRT (xem MSDN). Vì vậy, việc sử dụng nên bao gồm Mac, Linux và Windows.

QAbstractFileEngine không hiển thị chức năng này, tôi không nghĩ rằng nó sẽ khả dụng trong bất kỳ API hệ thống tệp Qt nào khác.

3

Tôi không nghĩ có bất kỳ điều gì cụ thể. Cách dễ nhất có thể là mở tệp để viết + chắp thêm và đóng lại - điều này cho phép hệ điều hành/Hệ thống tệp cập nhật thời gian đã sửa đổi.

Bạn cũng có thể thử đọc các quyền và gọi setPerimssions, đôi khi được sử dụng như một cách an toàn hơn để cập nhật tệp vì nó không bị chặn.

chỉnh sửa: để đặt thời gian sửa đổi tùy ý cuối cùng bạn có thể sử dụng - trên các chức năng của windows SetFileTime.

Có một số boost::filesystem::last_write_time() mà bạn muốn xem - Tôi chưa sử dụng.

+0

Điều đó sẽ không hiệu quả chút nào. Nếu dateTime bây giờ là B, tôi sao chép một tập tin đã được sửa đổi lần cuối tại dateTime A, bản sao sẽ có sửa đổi dateTime của B. xuống đường, như thời gian trôi qua, dateTime sẽ là C. Nếu tại thời điểm đó tôi mở và lưu các tập tin như bạn đề nghị nó sẽ có một dateTime sửa đổi cuối cùng của C. Rõ ràng đây là vô nghĩa như lastModified dataTime sẽ thậm chí còn nhiều hơn "off" bởi vì tôi cần nó là A và không C. Tôi cần dateModified dateTime là giống như tệp gốc. – user440297

+0

Xin lỗi? - bạn đặt thời gian sửa đổi lần cuối thành 'now' và bạn thực hiện việc này bằng cách sửa đổi tệp 'now'! –

+0

Tôi không muốn đặt thời gian sửa đổi lần cuối thành 'now'. Do đó, những gì bạn đề nghị sẽ không hoạt động. Tất cả các API của MS cho phép thiết lập các tem thời gian tập tin như Java và các API trưởng thành khác. Qt có thể nhận tem thời gian nhưng không thể đặt tem thời gian theo như tôi biết. Nếu tôi phải sử dụng WinAPI nhưng điều đó khiến tôi chìm trong bóng tối liên quan đến Linux và MAC. – user440297

3

Trong cửa sổ bao gồm qt_windows.h và phát với ngày sửa đổi và ngày tạo.

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

Đối với linux add bao gồm utime.hfcntl.h sau đó

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 filename = Filename.toStdWString().c_str(); 'là một lời khuyên rất xấu, bởi vì' filename' sẽ lưu con trỏ vào đối tượng tạm thời đã bị xóa – borisbn