File.Delete vs. Windows Explorer File Delete
От: Fortnum  
Дата: 15.09.14 07:06
Оценка:
Пишем простую консольную программу:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            using (var fs1 = new FileStream("test.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.Delete | FileShare.ReadWrite))
            {
                var exists1 = File.Exists(fs1.Name);
                
                File.Delete(fs1.Name);
                
                var exists2 = File.Exists(fs1.Name);

                File.Delete(fs1.Name);
            }
        }
    }
}


Оба exists дают true, но на втором FileDelete получаем в соответствии с документацией UnauthorizedAccessException (ERROR_ACCESS_DENIED по DeleteFile из WinApi). Но теперь ставим Break на фигурной скобке сразу после "using (var fs1 ...)", удаляем файл при помощи Проводника или Total Commander, и продолжаем исполнение — всё, никаких ошибок. Но теперь оба exists дают false.

Создаем вторую простую консольную программу с тем же кодом, что и первая. Запускаем их параллельно. Как только одна из них выполнит File.Delete — все остальные File.Delete у обоих дают UnauthorizedAccessException. При этом exists у всех true.

WinApi DeleteFile дает такой же результат: ERROR_ACCESS_DENIED.

Самое интересно, что после удаления Проводником, хэндлы остаются рабочими — можно писать и читать в файл. А вот из просмотра в том же Проводнике он исчезает, и Directory.GetFiles его не возвращает, ну, и File.Exists даёт false. А WinApi.DeleteFile (GetLastWin32Error) даёт ERROR_FILE_NOT_FOUND (вместо ERROR_ACCESS_DENIED).

Как Проводник удаляет таким хитрым способом?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.