2010-05-28 2 views
18

В случае, если что-то пошло не так, создавая файл, я писал во временный файл, а затем переехал в пункт назначения. Что-то вроде:File.Move не наследует разрешения от целевого каталога?

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

Проблема в том, что новый «bar.txt» в данном случае не наследует разрешения от «C: \ Foo» каталога. Тем не менее, если я создаю файл через explorer/notepad и т. Д. Непосредственно в «C: \ foo», проблем нет, поэтому я считаю, что разрешения правильно установлены на «C: \ foo».

Update

Найдено Inherited permissions are not automatically updated when you move folders, может быть, это относится к файлам, а также. Теперь вы ищете способ принудительного обновления прав доступа к файлам. Есть ли лучший способ сделать это?

ответ

26

Найдено, что мне было нужно, это:

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

Это сбрасывает права доступа к файлам, чтобы наследовать.

+2

Вам нужно сделать это, как только файл уже перемещен? В этом случае он больше не является атомарным - есть риск, что кто-то может попробовать и прочитать файл до того, как будут созданы разрешения – Neil

+1

@ Нет, это будет после переезда, и да, это сделает его более не атомарным. –

+3

@JosephKingry. Спасибо, это помогло мне. Но я также хотел удалить любые явные разрешения в результате перемещения. Еще несколько строк кода. http://stackoverflow.com/a/12821819/486660 – Jim

Смежные вопросы