Windows 删除和创建目录的奇怪情况
我遇到了一个奇怪的情况,在Windows Server 2008上连续快速删除和创建目录会导致一些偶然的奇怪错误。有时我会收到IOException,有一次我有一个NotAuthorizedException 下面是我的代码,但在调试器中单步执行时,会抛出大量异常。事实上,在执行directory.delete时,我刚刚遇到了一个IOException“目录不是空的!” 更新 相当多的回复谈到了非原子目录创建和延迟写入等问题。是否有一种100%保证的方法来实现这一点?理想情况下,我希望一些系统调用是“DeleteDirectoryAndWaitForTheDirectoryToBeDeleted”,而相应的系统调用是“CreateDirectoryAndWaitForTheDirectoryToBeCreated” 另一次更新 我把Neil的代码放在下面,在我的机器上试了试,但很快就失败了(经过20次循环)。似乎发生的情况是,IDriveE服务可以访问该目录,并且尝试创建该目录失败,删除挂起。我想我需要做更多的研究,比如删除挂起 就我个人而言,我不喜欢这个代码,因为它“闻起来”不对——但它是有效的Windows 删除和创建目录的奇怪情况,windows,Windows,我遇到了一个奇怪的情况,在Windows Server 2008上连续快速删除和创建目录会导致一些偶然的奇怪错误。有时我会收到IOException,有一次我有一个NotAuthorizedException 下面是我的代码,但在调试器中单步执行时,会抛出大量异常。事实上,在执行directory.delete时,我刚刚遇到了一个IOException“目录不是空的!” 更新 相当多的回复谈到了非原子目录创建和延迟写入等问题。是否有一种100%保证的方法来实现这一点?理想情况下,我希望一些系统调
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还使用了一种称为“延迟写入”的方法。因此,如果删除目录,它不会立即删除,它只是标记为删除。< /P> < P>以下的C++代码删除和重新创建目录尽可能快,没有问题在我的旧Wi2K框。您可能想在您的机器上试用它或类似产品
#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;
}
}
#包括
#包括
使用名称空间std;
int main(){
const char*DIRNAME=“testdir”;
试一试{
而(1){
if(rmdir(DIRNAME)=-1){
抛出“无法删除目录”;
}
if(mkdir(DIRNAME)=-1){
抛出“无法创建目录”;
}
}
}
捕获(常量字符*s){
cerr使用捕获删除,然后创建新目录。尝试检查谁拥有要删除目录的句柄。Sysinterals有几个工具可能会有所帮助-Process Explorer、FileMon、handle等。了解哪个进程持有打开的句柄可以节省您大量时间查找失败原因。更简单的这是随机的,所以我可以得到一些大的日志文件。不管怎样,我都会尝试一下-谢谢!如果你担心日志的大小,只需定义较小的过滤器。在进程监视器中,你有大量的过滤选项。只需运行一个你知道会失败的小测试,看看它是如何记录的。然后定义将失败的过滤只显示错误,然后让ProcMon一直运行,直到得到错误而没有太多噪音。有趣的是,它在我的机器上失败了!