stat — C ++, как получить недавно измененную временную метку файла?

Я хотел бы определить последнюю недавно измененную временную метку файла в Windows.

Да, я использовал функцию stat с st_atime, st_mtime, st_ctime. Однако Windows не обновляет эти временные метки для определенных файлов. (Я не хочу менять это поведение, потому что это будет зависеть от клиента позже).

Итак, как я могу определить последнюю недавно измененную временную метку файла?

например

  • Отметка времени переименования имени файла (Пока не могу заставить это работать)

  • Временная метка для модификации файла (это предоставляет mctime, но я бы предпочел одностороннее решение)

Заранее спасибо.

0

Решение

У меня был большой успех с использованием Boost’s filesystem::last_write_time(path), хотя мой опыт работы с Windows говорит мне, что если вы делаете много записей в файл за короткий промежуток времени, то разрешения на возвращенной метке времени недостаточно, чтобы различать, если вы запрашиваете метку времени после каждой записи

Вы можете использовать это так:

boost::filesystem::path filePath = "Path/To/My/File.txt"std::time_t writeTime = boost::filesystem::last_write_time(filePath);
std::ostringstream ss;
ss << std::put_time(&writeTime, "%c %Z");
std::string timeString = ss.str();

Рекомендации:

Редактировать:

Поскольку ОС не обновляет временную метку файла при переименовании, вам, к сожалению, придется начинать прослушивание событий. Этот ТАК пост есть хорошая информация о подключении к ним из C ++.

Сторона C ++ имеет ReadDirectoryChangesW, который позволяет вам передать обратный вызов как LPOVERLAPPED_COMPLETION_ROUTINE Подобно большому количеству специфичного для ОС кода, за ним довольно сложно следовать довольно быстро.

Что касается «прикосновения» к файлу при переименовании, так что метка времени обновляется, вы можете скопировать его себе. Увидеть CopyFile

Если вы не против написания управляемого кода C ++, есть FileSystemWatercher Переименованное Событие

1

Другие решения

Если вы находитесь на Windows, используйте GetFileTime (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=vs.85).aspx) где вы открыли свой файл через CreateFile (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx).

Очень рекомендую прочитать статьюПолучение времени последней записи«для этого: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724926(v=vs.85).aspx

редактировать после ваших комментариев:

В вашем приложении есть часть:

#include <string>
#include <sstream>
#include <iostream>

в методе GetLastWriteTime по ссылке вместо StringCchPrintf добавлять:

// Build a string showing the date and time.
std::stringstream ss;
ss << stLocal.wYear << "-" << stLocal.wMonth << "-" << stLocal.wDay << " " << stLocal.wHour << ":" << stLocal.wMinute ;
std::string timeString = ss.str();
std::cout << timeString;

и, пожалуйста, прочитайте документацию от: http://www.cprogramming.com/tutorial/c++-iostreams.html а затем ссылка из http://en.cppreference.com/w/cpp/io/basic_stringstream

0

По вопросам рекламы [email protected]