2011-08-23 47 views

回答

15
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; 
} 
+1

当目标文件已经存在时,您不需要在'destination'(或稍后创建)调用'Refresh'来获取正确的值吗? –

+0

@ Paul Ruane:你说得对 - 我已经更新了相应的答案,谢谢。 –

2

你应该能够阅读您需要的值,做出您希望的任何更改,然后恢复以前的值通过使用FileInfo的属性。

11

当执行没有管理权限罗伊的回答试图覆盖现有只读文件或试图设置复制只读文件的时间戳时,当会抛出异常(UnauthorizedAccessException)。

以下解决方案基于Roy的回答,但将其扩展为覆盖只读文件,并更改复制的只读文件的时间戳,同时保持文件的只读属性,同时仍在执行而无需管理员权限。

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; 
    } 
}