. net库在保留时间戳的情况下移动/复制文件

本文关键字:移动 复制 文件 情况下 保留 时间戳 net | 更新日期: 2023-09-27 18:06:39

有没有人知道。net库中可以复制/粘贴或移动文件而不更改任何时间戳?我正在寻找的功能包含在一个名为robocopy.exe的程序中,但我希望这个功能不必共享二进制文件。

想法吗?

. net库在保留时间戳的情况下移动/复制文件

public static void CopyFileExactly(string copyFromPath, string copyToPath)
{
    var origin = new FileInfo(copyFromPath);
    origin.CopyTo(copyToPath, true);
    var destination = new FileInfo(copyToPath);
    destination.CreationTime = origin.CreationTime;
    destination.LastWriteTime = origin.LastWriteTime;
    destination.LastAccessTime = origin.LastAccessTime;
}

在没有管理权限的情况下执行时,当试图覆盖现有的只读文件或试图在复制的只读文件上设置时间戳时,Roy的答案将抛出异常(UnauthorizedAccessException)。

下面的解决方案是基于Roy的答案,但扩展了它,覆盖只读文件,并更改复制的只读文件的时间戳,同时保留文件的只读属性,同时仍然在没有admin权限的情况下执行。

public static void CopyFileExactly(string copyFromPath, string copyToPath)
{
    if (File.Exists(copyToPath))
    {
        var target = new FileInfo(copyToPath);
        if (target.IsReadOnly)
            target.IsReadOnly = false;
    }
    var origin = new FileInfo(copyFromPath);
    origin.CopyTo(copyToPath, true);
    var destination = new FileInfo(copyToPath);
    if (destination.IsReadOnly)
    {
        destination.IsReadOnly = false;
        destination.CreationTime = origin.CreationTime;
        destination.LastWriteTime = origin.LastWriteTime;
        destination.LastAccessTime = origin.LastAccessTime;
        destination.IsReadOnly = true;
    }
    else
    {
        destination.CreationTime = origin.CreationTime;
        destination.LastWriteTime = origin.LastWriteTime;
        destination.LastAccessTime = origin.LastAccessTime;
    }
}

您可以读取和写入所有的时间戳,使用FileInfo类:

  • CreationTime
  • LastAccessTime
  • LastWriteTime

您应该能够读取您需要的值,进行任何更改,然后通过使用FileInfo的属性恢复以前的值