Пишем простую консольную программу:
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).
Как Проводник удаляет таким хитрым способом?
Здравствуйте, 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>>