2010-05-28 18 views
18

Nel caso qualcosa vada storto nella creazione di un file, ho scritto su un file temporaneo e poi mi sono spostato sulla destinazione. Qualcosa di simile:File.Move non eredita le autorizzazioni dalla directory di destinazione?

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

Il problema è che il nuovo "bar.txt" in questo caso non eredita le autorizzazioni dalla "C: \ foo" directory. Tuttavia, se creo un file tramite explorer/notepad etc direttamente in "C: \ foo" non ci sono problemi, quindi credo che le autorizzazioni siano correttamente impostate su "C: \ foo".

Aggiornamento

Trovato Inherited permissions are not automatically updated when you move folders, forse vale per i file pure. Ora stiamo cercando un modo per forzare un aggiornamento delle autorizzazioni dei file. C'è un modo migliore nel complesso di fare questo?

risposta

26

Trovato quello che mi serviva era questa:

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

Questo ripristina i permessi dei file di ereditare.

+2

Devi farlo una volta che il file è già stato spostato? Nel qual caso non è più atomico - c'è il rischio che qualcuno possa provare a leggere il file prima che le autorizzazioni siano in atto – Neil

+1

@Neil sì, questo sarebbe dopo lo spostamento e sì lo renderebbe non più atomico. –

+3

@JosephKingry. Grazie, questo mi ha aiutato. Ma volevo anche rimuovere eventuali permessi espliciti come risultato del Move. Solo poche righe di codice. http://stackoverflow.com/a/12821819/486660 – Jim

Problemi correlati