setLastModified дата с Qt - PullRequest
       5

setLastModified дата с Qt

5 голосов
/ 11 февраля 2011

Мне нужно установить дату последнего изменения для некоторых файлов.Это важная возможность для моего приложения.

Я не понимаю, как я могу сделать это с помощью QT.Я не вижу метод / функцию для этого.Я могу читать даты с помощью Qt, но я не вижу, как я могу установить даты.

Теперь ... Я знаю, что некоторые (я думаю, все на самом деле) Windows API от MS имеют такую ​​возможность.

Дело в том, что я не ищу только "Windows" решение.Мне нужна эта возможность работать на Windows, Linux и Mac.Вот почему я выбираю Qt ...

Любое предлагаемое решение должно быть ориентировано на API (не требуется системная команда / утилита), а решение должно охватывать 3 основные ОС (Win, Linux, Mac).

Ответы [ 3 ]

4 голосов
/ 11 февраля 2011

Функция posix для этого: utime (2) , которая также доступна в Windows как часть MSVCRT (см. MSDN ).Поэтому использование этого должно охватывать Mac, Linux и Windows.

Поскольку QAbstractFileEngine не предоставляет эту функциональность, я не думаю, что она будет доступна и в любых других API файловой системы Qt..

4 голосов
/ 29 сентября 2015

В окнах включите 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.h и fcntl.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 голосов
/ 11 февраля 2011

Не думаю, что есть что-то конкретное.Самый простой способ - открыть файл для записи + добавления и снова закрыть его - это позволит ОС / файловой системе обновить измененное время.

Вы также можете попробовать прочитать разрешения и вызвать setPerimssions, которые иногда используются какболее безопасный способ обновления файла, поскольку он неблокируемый.

edit: установить произвольное время последнего изменения, которое вы можете использовать - для окон SetFileTime функция.boost::filesystem::last_write_time( ) вы хотите посмотреть - я не использовал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...