使用Qt设置setLastModified日期

时间:2011-02-10 22:05:07

标签: c++ qt qt4 posix

我需要为某些文件设置上次修改日期。这是我申请的基本能力。

我不知道如何用QT做到这一点。我没有看到它的方法/功能。 我可以用Qt阅读日期,但我看不出如何设置日期。

现在......我知道一些(我认为实际上都是)来自MS的Windows API具有这种能力。

问题在于我不是在寻找“Windows”唯一的解决方案。我需要这种能力才能在Windows,Linux和Mac上运行。这就是我选择Qt的原因......

建议的任何解决方案都应该是以API为中心的(不需要系统命令/实用程序),解决方案应涵盖3个主要操作系统(Win,Linux,Mac)。

3 个答案:

答案 0 :(得分:4)

这个的posix函数是utime(2),它也可以在Windows上作为MSVCRT的一部分使用(参见MSDN)。所以使用它应该涵盖Mac,Linux和Windows。

由于QAbstractFileEngine没有公开此功能,我认为它不会在任何其他Qt文件系统API中可用。

答案 1 :(得分:4)

在Windows中包含qt_windows.h并使用修改日期和创建日期。

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

对于Linux,添加包含utime.hfcntl.h然后

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 :(得分:2)

我认为没有具体的内容。最简单的方法可能是打开文件进行写入+追加并再次关闭 - 这可以让操作系统/文件系统更新修改时间。

你也可以尝试阅读权限并调用setPerimssions,这有时被用作更新文件的更安全的方式,因为它是非阻塞的。

编辑:设置您可以使用的任意上次修改时间 - 在Windows SetFileTime函数上。

有一个boost::filesystem::last_write_time( )您想要查看 - 我还没有使用过它。