file - 如何将 Linux 和 Windows 上的文件元数据从 std::fs 支持的任何文件系统复制到任何文件系统?
问题描述
我需要将文件从给定源复制到给定目标,不仅是文件内容,还有它的元数据。特别是,我需要确保副本将具有与源相同的修改时间。
要复制文件,我使用该功能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
吗?我如何也可以复制文件元数据?
解决方案
你必须打电话sync_all()
。
尝试将所有操作系统内部元数据同步到磁盘。
此函数将尝试确保所有内存中的数据在返回之前到达文件系统。
这可用于处理仅在关闭文件时才会捕获的错误。删除文件将忽略同步此内存数据的错误。