Я хотел бы определить последнюю недавно измененную временную метку файла в Windows.
Да, я использовал функцию stat с st_atime, st_mtime, st_ctime. Однако Windows не обновляет эти временные метки для определенных файлов. (Я не хочу менять это поведение, потому что это будет зависеть от клиента позже).
Итак, как я могу определить последнюю недавно измененную временную метку файла?
например
Отметка времени переименования имени файла (Пока не могу заставить это работать)
Временная метка для модификации файла (это предоставляет mctime, но я бы предпочел одностороннее решение)
Заранее спасибо.
У меня был большой успех с использованием 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 Переименованное Событие
Если вы находитесь на 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