2011-08-23 15 views

Respuesta

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

¿No tendría que llamar a 'Refresh' en' destination' (o crearlo más tarde) para obtener los valores correctos cuando el archivo de destino ya existe? –

+0

@Paul Ruane: Tiene razón, he actualizado la respuesta en consecuencia, gracias. –

2

Usted debe ser capaz de leer el valores que necesita, realice los cambios que desee y luego restablezca los valores anteriores mediante el uso de las propiedades de FileInfo.

11

Cuando se ejecuta sin privilegios administrativos respuesta de Roy va a lanzar una excepción (UnauthorizedAccessException) al intentar sobreescribir archivos sólo de lectura existentes o cuando se intenta establecer las marcas de tiempo en los archivos copiados sólo lectura.

La siguiente solución se basa en la respuesta de Roy pero la amplía para sobrescribir archivos de solo lectura y cambiar las marcas de tiempo en archivos de solo lectura copiados mientras conserva el atributo de solo lectura del archivo mientras se ejecuta sin privilegios de administrador.

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