Russian Qt Forum
Ноябрь 25, 2024, 04:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Установка времени файла  (Прочитано 7648 раз)
Zmeishe
Гость
« : Июль 02, 2008, 12:32 »

Qt 4.3.3
Если менять время так, у файла оно получается на несколько секунд меньше
Код:
#include <sys/utime.h>

...
QDateTime dt;
...

#ifdef Q_OS_WIN
    filePath.replace("/", "\\");
#endif   

struct utimbuf times;
times.actime = times.modtime = dt.toTime_t();     
utime(filePath.toLatin1().data(), &times);


Если иcпользовать WinAPI, то устанавливается точь в точь как надо.
Код:
#ifdef Q_OS_WIN
#include <qt_windows.h>
#endif

...
 QDateTime dt;
 SYSTEMTIME systemTime;
 FILETIME fileTime, localFileTime;
 HANDLE hFile;
...

#ifdef Q_OS_WIN
    systemTime.wYear = dt.date().year();
    systemTime.wMonth = dt.date().month();
    systemTime.wDayOfWeek = dt.date().dayOfWeek();
    systemTime.wDay = dt.date().day();
    systemTime.wHour = dt.time().hour();
    systemTime.wMinute = dt.time().minute();
    systemTime.wSecond = dt.time().second();
    systemTime.wMilliseconds = dt.time().msec();
    SystemTimeToFileTime(&systemTime, &localFileTime);
    LocalFileTimeToFileTime(&localFileTime, &fileTime);
    filePath.replace("/", "\\");
    hFile = CreateFile(filePath.utf16(), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);   
    SetFileTime(hFile, &fileTime, &fileTime, &fileTime);
    CloseHandle(hFile);
#endif     
Выходит врёт функция QDateTime::toTime_t() ?

Или я чего-то не догоняю ?

« Последнее редактирование: Июль 02, 2008, 13:56 от Zmeishe » Записан
Zmeishe
Гость
« Ответ #1 : Июль 02, 2008, 13:55 »

А вот в Linux первый вариант работает безупречно.
Код:
#include <utime.h>

...
QDateTime dt;
...

#ifdef Q_OS_WIN
    filePath.replace("/", "\\");
#endif   

struct utimbuf times;
times.actime = times.modtime = dt.toTime_t();     
utime(filePath.toLatin1().data(), &times);

Похоже дело не в QDateTime::toTime_t() - или не только в ней, а чём-то ещё
Записан
Sergeich
Гость
« Ответ #2 : Июль 03, 2008, 00:45 »

А какая вообще задача? установить время модификации файла? Зачем это нужно? Просто любопытно Улыбающийся
Записан
Zmeishe
Гость
« Ответ #3 : Июль 03, 2008, 07:59 »

Это нужно для автоматического обновления программных модулей.
Я в БД, в BLOB поле, закачиваю свежие бинарники и их зависимости от моих же библиотек. В другое поле таблицы записываю дату и время последней модификации QFileInfo::lastModified() этого бинарника.
Когда на удалённой машине стартует клиентский модуль, он проверяет своё lastModified() и сравнивает с эталонным из БД, а заодно и все зависимости.
В случае необходимости, подменяет сам себя и свои зависимости.(или почти сам себя  Подмигивающий)
Последний штрих - это установка lastModified() равным эталонному.

Записан
Tonal
Гость
« Ответ #4 : Июль 03, 2008, 10:25 »

По моему проше хешик считать CRC или MD5 - вполне надёжно и быстро для этих объёмов. Улыбающийся
Записан
ритт
Гость
« Ответ #5 : Июль 03, 2008, 10:58 »

Согласен с Тонал'ом

а вообще, хранение бинарников блобом (и, подозреваю, обновление вместе с репликацией бд) - не самый удачный вариант!
однажды попался мне на глаза продукт конкурентов, в котором система обновлений работала по схожему принципу. всё, что было нужно: 1) добраться на мастер-сервере до этой таблицы с привилегиями на запись; 2) налокальной площадке заразить трояном самый свежий бинарь из этой таблицы; 3) записать его поверх оригинального + обновить дату модификации...
...что было дальше представляешь?

в общем, зашей хотя бы механизм проверки целостности, если будешь двигаться в этом направлении Улыбающийся
Записан
Zmeishe
Гость
« Ответ #6 : Июль 03, 2008, 11:13 »

Замечания интересные, честно говоря, сам не подумал о таком заражении.
Но если получить права SYSDBA на эту таблицу или root`а на машине, где база лежит, то, по моему, уже ни CRC ни MD5 не спасёт, т.к. абсолютно ВСЁ станет доступным и ключи шифрования тоже.

PS:
"Если возможного изнасилования избежать не удалось - расслабьтесь и получите удовольствие"
из инструкции агентесс британских спецслужб.
Записан
ритт
Гость
« Ответ #7 : Июль 03, 2008, 11:42 »

а я и не говорил про рута...
подсказываю: софтина была написана на мфц...догадываешься какие люди писали защиту? Улыбающийся

а механизм проверки целостности спасёт! если это не тупо црц'шка, зашитая прямо в код, то банальным заражением нарушится целостность и автоматом модуль не обновится - клиенты не получат и гемор и не уйдут к конкурентам...а ты неспешно залатаешь дыры на сервере Улыбающийся

но это всё оффтоп, а тема, похоже, исчерпана...давайте её трэшанём?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.214 секунд. Запросов: 21.