2011-08-23 13 views

Odpowiedz

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

Czy nie musiałbyś wywoływać 'Odśwież' w' miejscu docelowym' (lub tworzyć go później), aby uzyskać prawidłowe wartości, gdy plik docelowy już istnieje? –

+0

@Paul Ruane: Masz rację - zaktualizowałem odpowiedź odpowiednio, dziękuję. –

2

powinien być w stanie przeczytać wartości, których potrzebujesz, wprowadź dowolne zmiany, a następnie przywróć poprzednie wartości przy użyciu właściwości FileInfo.

11

Podczas wykonywania bez uprawnień administracyjnych odpowiedź Roya rzuci wyjątek (UnauthorizedAccessException), gdy próbuje nadpisać istniejące pliki tylko do odczytu lub gdy próbuje ustawić znaczniki czasu na skopiowanych plików tylko do odczytu.

Poniższe rozwiązanie jest oparte na odpowiedzi Roya, ale rozszerza ją na nadpisywanie plików tylko do odczytu i zmianę znaczników czasowych na kopiowanych plikach tylko do odczytu, zachowując atrybut tylko do odczytu pliku, podczas gdy wciąż wykonuje się bez uprawnień administratora.

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; 
    } 
} 
Powiązane problemy