Как скопировать метаданные файла в Linux и Windows из и в любую файловую систему, поддерживаемую std :: fs? - PullRequest
1 голос
/ 30 июня 2019

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

Для копирования файла я использую функцию std::fs::copy. В документации не указано, копируются ли метаданные или нет, и в редких случаях происходит сбой при копировании метаданных файла.

Следующий код:

fs::copy(source, dest)?;
debug_assert_eq!(
    fs::metadata(source)?.modified()?,
    fs::metadata(dest)?.modified()?
);

иногда паникует:

thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `SystemTime { tv_sec: 1556721917, tv_nsec: 270615000 }`,
 right: `SystemTime { tv_sec: 1556721917, tv_nsec: 0 }`',

Когда это не удается, поле tv_nsec всегда устанавливается в 0. Это ошибка std::fs::copy? Как я могу скопировать метаданные файла тоже?

1 Ответ

0 голосов
/ 30 июня 2019

Вы должны позвонить sync_all().

Пытается синхронизировать все внутренние метаданные ОС на диске.

Эта функция будет пытаться обеспечить, чтобы все данные в памяти дошли до файловой системы, прежде чем вернуться.

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

...