SSD驱动器上的奇怪目录删除行为

Vnu*_*nuk 26 .net directory file delete-file

目录c:\ test中有50个左右的文件,没有子目录.

    If IO.Directory.Exists("C:\test") Then
        IO.Directory.Delete("C:\test", True)
    End If

    IO.Directory.CreateDirectory("C:\test")
Run Code Online (Sandbox Code Playgroud)

Drive C是Intel的X25-M80 SSD驱动器,OS是支持TRIM的Windows 7 64位,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")
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

我在这里明显的WTF旁边的问题是:

  • IO.Directory.Delete不应该是一个阻塞函数调用,无论驱动器是什么
  • 由于启用了TRIM支持,SSD是否在"删除"作弊?

csh*_*net 16

我以前遇到过这方面的问题,但这并不是SSD驱动器特有的.你做一个移动然后删除会好得多:

if(Directory.Exists(dirpath))
{
    string temppath = dirpath + ".deleted";
    Directory.Move(dirpath, temppath);
    Directory.Delete(temppath, true);
}
Directory.Create(dirpath);
Run Code Online (Sandbox Code Playgroud)

处理它的另一种方法是循环直到完成:

if(Directory.Exists(dirpath))
{
    Directory.Delete(dirpath, true);
    int limit = 100;
    while(Directory.Exists(dirpath) && limit-- > 0)
        Thread.Sleep(0);
}
Directory.Create(dirpath);
Run Code Online (Sandbox Code Playgroud)


Rit*_*ton 5

在使用反射器探索System.IO.Directory之后,它看起来像.Delete只是FindFirstFile,FindNextFile和RemoveDirectory Win API调用的包装器.关于.Net运行时调用这些API调用或API实现本身,没有任何线程或异步.

现在,假设它以某种方式出现TRIM问题,您可以通过打开提升的命令提示符并使用fsutil来禁用TRIM:

fsutil behavior set disabledeletenotify 1
Run Code Online (Sandbox Code Playgroud)

要启用,请使用0作为参数运行相同的命令.

要查询,请使用query作为命令参数:

fsutil behavior query disabledeletenotify 
Run Code Online (Sandbox Code Playgroud)