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).

Как Проводник удаляет таким хитрым способом?
Re: File.Delete vs. Windows Explorer File Delete
От: DarthSidius  
Дата: 15.09.14 07:17
Оценка: 9 (1) +4 :)
Здравствуйте, Fortnum, Вы писали:

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


F>Как Проводник удаляет таким хитрым способом?


Просто перемещает в корзину?
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 58>>
♠♠♥♠♠♦♥
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.