Мы использовали следующий код в течение нескольких лет.
/// <summary>
/// Opens a file and returns an exclusive handle. The file is deleted as soon as the handle is released.
/// </summary>
/// <param name="path">The name of the file to create</param>
/// <returns>A FileStream backed by an exclusive handle</returns>
/// <remarks>If another process attempts to open this file, they will recieve an UnauthorizedAccessException</remarks>
public static System.IO.FileStream OpenAsLock(string path)
{
var stream = TranslateIOExceptions(() => System.IO.File.Open(path, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write, System.IO.FileShare.Delete));
System.IO.File.Delete(path);
return stream;
}
Из памяти этот код использовал , чтобы оставить файл на месте, пока FileStream не будет закрыт. Этот метод использовался как часть кооперативной блокировки параллелизма.
Я обнаружил ряд других вопросов, которые заставляют меня думать, что поведение было таким, как описано в комментарии: файл остается на месте до тех пор, пока возвращенный файловый поток не будет закрыт. .
Сможем ли мы когда-нибудь удалить открытый файл в Windows?
Может ли использование FileShare.Delete вызвать исключение UnauthorizedAccessException?
Однако в ходе расследования я обнаружил, что Windows не ведет себя так. Вместо этого файл удаляется, как только выполняется вызов File.Delete. Я также попытался воспроизвести ошибку, предложенную Гансом, которая могла бы произойти в приведенной выше ссылке, но безуспешно.
class Program
{
static void Main(string[] args)
{
File.Open("test", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Delete);
File.Delete("test");
File.WriteAllText("test", "hello world");
Console.Write(File.ReadAllText("test"));
Console.ReadLine();
}
}
К сожалению, проведенный нами модульный тест, который мог обнаружить это изменение в поведении, не был настроен для правильной работы ночью наше окружение, поэтому я не могу быть уверен, что оно когда-нибудь станет зеленым.
Было ли это реальным изменением в поведении? Мы знаем, когда это случилось? Было ли это умышленно (задокументировано)?