2010-05-28 18 views
18

En caso de que algo salga mal al crear un archivo, he estado escribiendo en un archivo temporal y luego moviéndome al destino. Algo así como:¿File.Move no hereda los permisos del directorio de destino?

 var destination = @"C:\foo\bar.txt"; 
     var tempFile = Path.GetTempFileName(); 
     using (var stream = File.OpenWrite(tempFile)) 
     { 
      // write to file here here 
     } 

     string backupFile = null; 
     try 
     { 
      var dir = Path.GetDirectoryName(destination); 
      if (!Directory.Exists(dir)) 
      { 
       Directory.CreateDirectory(dir); 
       Util.SetPermissions(dir); 
      } 

      if (File.Exists(destination)) 
      { 
       backupFile = Path.Combine(Path.GetTempPath(), new Guid().ToString()); 
       File.Move(destination, backupFile); 
      } 

      File.Move(tempFile, destination); 

      if (backupFile != null) 
      { 
       File.Delete(backupFile); 
      } 
     } 
     catch(IOException) 
     { 
      if(backupFile != null && !File.Exists(destination) && File.Exists(backupFile)) 
      { 
       File.Move(backupFile, destination); 
      } 
     } 

El problema es que el nuevo "bar.txt" en este caso no hereda los permisos de la "C: \ foo" directorio. Sin embargo, si creo un archivo mediante el explorador/bloc de notas, etc. directamente en "C: \ foo", no hay problemas, por lo que creo que los permisos están configurados correctamente en "C: \ foo".

actualización

Encontrado Inherited permissions are not automatically updated when you move folders, tal vez se aplica a los archivos también. Ahora busca una forma de forzar una actualización de los permisos de archivos. ¿Hay una mejor manera en general de hacer esto?

Respuesta

26

encontrado lo que necesitaba era la siguiente:

var fs = File.GetAccessControl(destination); 
fs.SetAccessRuleProtection(false, false); 
File.SetAccessControl(destination, fs); 

Esto restablece los permisos de archivo para heredar.

+2

¿Tiene que hacer esto una vez que el archivo ya se ha movido? En ese caso ya no es atómico: existe el riesgo de que alguien intente leer el archivo antes de que los permisos estén en su lugar – Neil

+1

@Neil sí, esto sería después del traslado y sí, ya no lo haría atómico. –

+3

@JosephKingry. Gracias, esto me ayudó. Pero también quería eliminar los permisos explícitos como resultado del movimiento. Solo unas pocas líneas más de código. http://stackoverflow.com/a/12821819/486660 – Jim

Cuestiones relacionadas