2011-08-23 9 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; 
    } 
} 
関連する問題