【发布时间】:2011-08-26 18:13:47
【问题描述】:
目录 c:\test 里面有 50 个左右的文件,没有子目录。
If IO.Directory.Exists("C:\test") Then
IO.Directory.Delete("C:\test", True)
End If
IO.Directory.CreateDirectory("C:\test")
驱动器 C 是 Intel 的 X25-M80 SSD 驱动器,操作系统是 Windows 7 64 位,支持 TRIM,Visual Studio 是 2008,目标框架 3.5。执行上述代码时,CreateDirectory 会在没有(可见)异常的情况下中断代码执行。经过一番头疼后,我发现在代码执行到达 CreateDirectory 时删除尚未完成。如果我这样修改我的代码:
If IO.Directory.Exists("C:\test") Then
IO.Directory.Delete("C:\test", True)
End If
Threading.Thread.Sleep(2000)
IO.Directory.CreateDirectory("C:\test")
然后一切都按预期进行。
除了明显的 WTF 之外,我的问题是:
- 无论驱动器是什么,IO.Directory.Delete 都不应该是阻塞函数调用
- 由于启用了 TRIM 支持,SSD 在删除时是否“作弊”?
【问题讨论】:
-
出于好奇,如果您在删除目录后立即再次测试
If IO.Directory.Exists("C:\test")会发生什么? -
如果我将 Thread.Sleep 替换为 Debug.WriteLine(IO.Directory.Exists("C:\temp") 它将返回 False 并且 CreateDirectory 成功。如果我删除这个 Exists 检查 CreateDirectory 会失败,如所述。
-
在我的 X25-M160 和 60 GB OCZ Vertex Turbo 上运行良好。你能显示两个线程的调用堆栈吗?
-
听起来“某事”是惰性写入,可能是内核、控制器或 SSD 本身!
-
作为一种变通方法,如果您将 test 重命名为 test-deleting、删除它并调用 create 会怎样?
标签: .net file directory delete-file