File.Delete
будет помечать файл для удаления.Файл действительно будет удален только тогда, когда все дескрипторы к нему закрыты (если таких дескрипторов нет - он всегда будет удален после возврата File.Delete).Как описано для DeleteFile функция winapi (которая используется C # File.Delete
):
Функция DeleteFile помечает файл для удаления при закрытии.Поэтому удаление файла не происходит до тех пор, пока последний дескриптор файла не будет закрыт
Обычно нет открытых дескрипторов для файлов, которые вы удаляете.Или, если есть открытые дескрипторы - они обычно не имеют общего ресурса «удалить» (этот общий ресурс позволяет другому процессу пометить файл для удаления), поэтому при попытке удалить такой файл - он либо удаляется (без открытых дескрипторов), либоотказано в доступе или сгенерировано похожее исключение (некоторые дескрипторы, но без общего ресурса удаления).
Однако иногда некоторые программы, такие как антивирус или индексатор поиска, могут открывать произвольные файлы с помощью общего ресурса «удалить» и удерживать их в течение некоторого времени.время.Если вы попытаетесь удалить такой файл - он пройдет без ошибок, и файл действительно будет удален, когда это программное обеспечение закроет свой дескриптор.Тем не менее, File.Exists
вернет true для такого файла, ожидающего удаления.
Вы можете воспроизвести эту проблему с помощью этой простой программы:
public class Program {
public static void Main() {
string path = @"G:\tmp\so\tmp.file";
// create file with delete share and don't close handle
var file = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete);
DestroyFile(path);
GC.KeepAlive(file);
}
private static void DestroyFile(string path) {
try {
if (File.Exists(path)) {
// no error
File.Delete(path);
}
// but still exists
if (File.Exists(path)) {
throw new IOException(string.Format("Failed to delete file: '{0}'.", path));
}
}
catch (Exception ex) {
throw ex;
}
}
}
Вы можете повторить File.Exists
проверить навсегда впрограмма выше - файл будет существовать, пока вы не закроете дескриптор.
Так вот, что происходит в вашем случае - какая-то программа имеет открытый дескриптор этого файла с FileShare.Delete
.
Вы должны ожидать такогоситуация.Например - просто удалите эту проверку File.Exists
, так как вы отметили файл для удаления, и он все равно будет удален.