我有一种奇怪的情况,在Windows Server 2008上快速连续删除和创建目录会导致一些偶然的奇怪错误。有时我得到IOExceptions,有一次我遇到了NotAuthorizedException。
这是我的代码可行,但是当在调试器中单步执行时,会抛出许多异常。事实上,在执行directory.delete时,我刚刚遇到了“目录不为空”的IOException!
更新 相当多的回复谈论非原子目录创建和延迟写入等。是否有100%保证的方式使这项工作?理想情况下,我想要一些系统调用'DeleteDirectoryAndWaitForTheDirectoryToBeDeleted'和相应的系统调用'CreateDirectoryAndWaitForTheDirectoryToBeCreated'。
另一次更新 我在下面使用了Neil的代码并在我的机器上进行了尝试,它很快就失败了(在20次循环之后)。似乎正在发生的事情是IDriveE服务可以访问该目录,并且尝试创建目录失败并使用DELETE PENDING。我想我需要对DELETE PENDING这样的事情做更多的研究。
就我个人而言,我不喜欢这个代码,因为它'闻起来'错了 - 但它确实有效。
Console.WriteLine("CleanAndCreateDirectory: {0}", baseDirectory);
while (Directory.Exists(baseDirectory))
{
Console.WriteLine("DeleteDirectory: {0}", baseDirectory);
try
{
Directory.Delete(baseDirectory, true);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
Thread.Sleep(1000);
}
}
while (!Directory.Exists(baseDirectory))
{
try
{
Directory.CreateDirectory(baseDirectory);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
我怀疑看文件系统会导致某些操作延迟,但我不知道是什么。
答案 0 :(得分:4)
当您从文件系统中删除某个项目时,它不会立即将其删除 - 它会在以后将其标记为删除(如果该目录包含子文件夹/文件,则会抛出异常)。
答案 1 :(得分:2)
Windows也使用称为“延迟写入”的内容。因此,如果删除目录,则不会立即将其删除,只是标记为删除。
答案 2 :(得分:2)
以下C ++代码尽可能快地删除并重新创建目录,而旧的Win2K盒子没有任何问题。您可能希望在您的计算机上尝试或类似。
#include <iostream>
#include <direct.h>
using namespace std;
int main() {
const char * DIRNAME = "testdir";
try {
while(1) {
if ( rmdir( DIRNAME ) == -1 ) {
throw "could not remove directory";
}
if ( mkdir( DIRNAME ) == -1 ) {
throw "could not create directory";
}
}
}
catch( const char * s ) {
cerr << "Error: " << s << endl;
}
}
答案 3 :(得分:2)
使用FileSystemWatcher来捕获删除,然后创建新目录。
答案 4 :(得分:0)
问题是删除目录及其所有内容不是原子操作。因此,如果在删除代码“清除”目录后还有其他任何内容将文件添加到目录中,则删除目录可能会失败。
您可能希望对循环进行计数,以便在删除或创建存在实际问题时不会挂起。