Файл используется Исключение в Directory.Delete с путем к папке в сообщении

Привет, я запускаю следующий код:

void bar()
{
    var dirInfo = new DirectoryInfo("C:\foo\folder");
    dirInfo.Delete();
}

И в какой-то момент я получил следующее исключение:

System.IO.IOException: The process cannot access the file 'C:\foo\folder' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
at bar()

Здесь меня смущают две вещи:

Я вызвал метод DirectoryInfo Delete(). Почему я получил Delete() из каталога в трассировке стека, а не из DirectoryInfo?

Почему используемый файл имеет тот же путь, что и моя папка? Это ошибка в сообщении? Или была другая ошибка?


person Mugen    schedule 19.05.2015    source источник
comment
Ваш каталог пуст?   -  person Yuval Itzchakov    schedule 19.05.2015
comment
Итак, все, что вы делаете, это var dirInfo = new DirectoryInfo("C:\foo\folder"); dirInfo.Delete();. Ничего между этими двумя утверждениями? Просто тренируете жесткий диск? Улучшение вашего кода может заключаться в том, чтобы ничего не делать...   -  person spender    schedule 19.05.2015
comment
@YuvalItzchakov В этот момент мой каталог пуст, так как я сначала очищаю все его содержимое.   -  person Mugen    schedule 19.05.2015
comment
@Mugen Вы оборачиваете свой вызов в try-catch или ловите первый шанс с помощью отладчика?   -  person Yuval Itzchakov    schedule 19.05.2015
comment
@spender зачем мне что-то делать между этими утверждениями? Я делаю вещи с папкой заранее.   -  person Mugen    schedule 19.05.2015
comment
@Mugen Мой плохой. Я думал, что вы тоже создаете папку.   -  person spender    schedule 19.05.2015
comment
@YuvalItzchakov Я использую try-catch. Это посмертный осмотр   -  person Mugen    schedule 19.05.2015
comment
Странный. Когда я заключаю код в try-catch, я вижу вызов DirectoryInfo.Delete в ST.   -  person Yuval Itzchakov    schedule 19.05.2015


Ответы (1)


Чтобы ответить на первый из ваших вопросов, DirectoryInfo.Delete звонит Directory.Delete. Если вы работаете в режиме выпуска, возможно, компилятор оптимизировал ваш код, и вы видите только базовый вызов.

Изменить: я только что провел несколько тестов в VS2013. Когда мой проект был релизной сборкой, скомпилированной для Any CPU, я мог видеть вызов DirectoryInfo.Delete перед вызовом Directory.Delete в трассировке стека:

StackTrace:
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
   at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
   at System.IO.DirectoryInfo.Delete()
   at test.Program.Main(String[] args) in c:\Projects\test\Program.cs:line 21

но когда я скомпилировал сборку релиза для x64, он показал только вызов Directory.Delete:

StackTrace:
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
   at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
   at test.Program.Main(String[] args) in c:\Projects\test\Program.cs:line 22

Похоже, что происходит некоторая оптимизация (кстати, код не менялся между тестами — я предполагаю, что изменение номера строки также как-то связано с оптимизацией компилятора).

Взгляните на этот вопрос - удаление информации о каталоге против удаления каталога

Чтобы ответить на ваш другой вопрос - у вас был файл в каталоге, открытый в другом приложении? Есть много причин, по которым другой процесс может что-то делать с этой папкой.

person Matt Hogan-Jones    schedule 19.05.2015
comment
Я не понимаю, как это отвечает на вопрос ОП о том, почему вызов его метода не фиксируется в трассировке стека. - person Yuval Itzchakov; 19.05.2015
comment
Что ж, в вопросе, который я связал с декомпилированным источником, показано, что вызов DirectoryInfo.Delete затем вызывает Directory.Delete - на самом деле трассировка стека не показывает его из-за того, что компилятор оптимизирует свой код. - person Matt Hogan-Jones; 19.05.2015
comment
Итак, вы предполагаете, что он работает в режиме релиза, а компилятор оптимизируется. Даже если это правда, вы должны добавить это к своему ответу. - person Yuval Itzchakov; 19.05.2015
comment
Это имеет смысл. Этот код был скомпилирован с применением оптимизаций. - person Mugen; 19.05.2015
comment
@MattJones Я явно проверяю, что в папке нет подэлементов. Возможно, папка используется другим процессом, но сообщение об ошибке выглядит странно. - person Mugen; 19.05.2015
comment
@Mugen - когда я получаю подобные ошибки при удалении файлов / папок, я обращаюсь к Process Explorer или LockHunter, чтобы узнать, в чем причина проблемы. - person Matt Hogan-Jones; 19.05.2015