我有一个奇怪的情况,在Windows Server 2008上快速连续删除和创build目录会导致一些偶然的奇怪错误。 有时我得到IOExceptions,有一次我有一个NotAuthorizedException。
这是我的代码工作,但是当在debugging器中通过,大量的exception被抛出。 实际上,我只是在执行directory.delete时发生IOExceptionexception,“目录不为空”!
更新相当多的回应谈论非primefaces目录创build和延迟写入等。有100%的保证方式,使这项工作? 理想情况下,我想要一些系统调用是'DeleteDirectoryAndWaitForTheDirectoryToBeDeleted'和相应的系统调用是'CreateDirectoryAndWaitForTheDirectoryToBeCreated'。
另一个更新,我拿下尼尔的代码,并试图在我的机器上,它很快失败(20循环后)。 看来正在发生的事情是,IDriveE服务可以访问该目录,并尝试创build该目录失败,删除等待。 我想我需要做更多的研究,如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); } }
我的怀疑是看文件系统,导致一些操作延迟,但我不知道是什么。
当你从文件系统中删除一个项目,它不会立即删除它 – 它标记为在以后的日期删除(也如果该目录包含子文件夹/文件,它将引发异常)。
Windows也使用一种叫做“延迟写入”的东西。 所以,如果你删除一个目录,它不是立即删除,而只是标记为删除。
以下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; } }
使用FileSystemWatcher来捕获删除,然后创建新的目录。
问题是,删除一个目录及其所有内容不是一个原子操作。 因此,如果在删除代码已经“清除”目录之后,其他任何东西都将文件添加到目录中,则删除目录可能会失败。
您可能希望对循环进行计数,以便在删除或创建时存在实际问题时不会挂起。