首先,我使用Visual Studio 2015实现的即将推出的基于Boost :: Filesystem的C ++ 17标准的Filesystem库。
基本上,我尝试做的是保存文件的时间戳(它的最后写入时间"),将该文件的内容复制到存档以及所述时间戳,然后将该文件提取出来并使用保存的时间戳恢复正确的"最后写入时间"。
// Get the file's 'last write time' and convert it into a usable integer.
__int64 timestamp = chrono::time_point_cast<chrono::seconds>(fs::last_write_time(src)).time_since_epoch().count();
// ... (do a bunch of stuff in here)
// Save the file
ofstream destfile(dest, ios::binary | ios::trunc);
destfile.write(ptr, size);
// Correct the file's 'last write time'
fs::last_write_time(dest, chrono::time_point<chrono::system_clock>(chrono::seconds(timestamp)));
问题是新文件总是以一个等于创建时间的时间戳结束(现在),因为我从来没有调用last_write_time()
。
当我尝试将时间戳从一个现有文件复制到另一个文件时,它可以正常工作。当我从文件中复制时间戳时,使用fs::copy
创建该文件的新副本,然后立即更改副本的时间戳,它也可以正常工作。以下代码正常工作:
// Get the file's 'last write time' and convert it into a usable integer.
__int64 timestamp = chrono::time_point_cast<chrono::seconds>(fs::last_write_time("test.txt")).time_since_epoch().count();
fs::copy("test.txt", "new.txt");
// Correct the file's 'last write time'
fs::last_write_time("new.txt", chrono::time_point<chrono::system_clock>(chrono::seconds(timestamp)));
我没有理由怀疑存储时间戳可能不正确,但我没有其他想法。可能导致这种情况的原因是什么?
答案 0 :(得分:5)
这是因为您写入了流但在实际更新时间之前没有关闭文件。时间将在结束时再次更新。
解决方案是关闭流,然后更新文件时间。