В случае, если что-то идет не так при создании файла, я записываю во временный файл и затем перемещаюсь к месту назначения. Что-то вроде:
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". Тем не менее, если я создаю файл через проводник / блокнот и т. Д. Непосредственно в «C: \ foo», проблем не возникает, поэтому я считаю, что права доступа правильно установлены в «C: \ foo».
Обновление
Найдено Унаследованные разрешения не обновляются автоматически при перемещении папок , возможно, это относится и к файлам. Теперь ищем способ форсировать обновление прав доступа к файлам. Есть ли лучший способ сделать это в целом?