首页 > 解决方案 > 如何将 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吗?我如何也可以复制文件元数据?

标签: filerustcopymetadata

解决方案


你必须打电话sync_all()

尝试将所有操作系统内部元数据同步到磁盘。

此函数将尝试确保所有内存中的数据在返回之前到达文件系统。

这可用于处理仅在关闭文件时才会捕获的错误。删除文件将忽略同步此内存数据的错误。


推荐阅读