Почему я не могу изменить "время последней записи" моих недавно созданных файлов?

Прежде всего, я использую реализацию Visual Files 2015 библиотеки файловой системы из будущего стандарта C++17, который основан на Boost::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)));

У меня нет причин подозревать, что сохранение метки времени может быть неправильным, но у меня нет других идей. Что может быть причиной этого?

1 ответ

Решение

Это происходит потому, что вы записали в поток, но не закрыли файл до фактического обновления времени. Время будет обновлено снова при закрытии.

Решение состоит в том, чтобы закрыть поток и затем обновить время файла.

Другие вопросы по тегам