您好我正在运行以下代码:
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()。为什么我在没有DirectoryInfo的堆栈跟踪中获得Directory的Delete()?
为什么使用的文件与我的文件夹具有相同的路径?这是消息中的错误吗?或者有不同的错误?
答案 0 :(得分: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
要回答您的其他问题 - 您是否在另一个应用中打开了目录中的文件?有很多原因导致另一个进程可能对该文件夹执行某些操作。