2015-05-19 4 views
0

Привет Я бегу следующий код:Файл используется Exception в 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() 

Меня беспокоят две вещи:

Я назвал Delete() DirectoryInfoInfo. Почему я нашел Directory Delete() в трассировке стека без ссылки DirectoryInfo?

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

+0

Ваш каталог пуст? –

+0

Итак, все, что вы делаете, это 'var dirInfo = new DirectoryInfo (" C: \ foo \ folder "); dirInfo.Delete(); '. Ничего между этими двумя утверждениями? Просто упражнение на жестком диске? Улучшением вашего кода может быть абсолютно ничего ... – spender

+0

@YuvalItzchakov Мой каталог пуст в этот момент, так как я сначала очистил все его содержимое. – Mugen

ответ

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 

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

Взгляните на этот вопрос - directoryinfo delete vs directory delete

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

+1

Я не вижу, как это отвечает на вопрос о том, почему его метод не захватывается в стеке. –

+0

Ну, в вопросе, который я связал с декомпилированным источником, показано, что вызов DirectoryInfo.Delete затем вызывает Directory.Delete - afaik трассировка стека не показывает его из-за компилятора, оптимизирующего его код. –

+1

Итак, вы предполагаете, что он работает в режиме деблокирования, а компилятор оптимизирует. Даже если это правда, вы должны добавить это к своему ответу. –