Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 删除和创建目录的奇怪情况_Windows - Fatal编程技术网

Windows 删除和创建目录的奇怪情况

Windows 删除和创建目录的奇怪情况,windows,Windows,我遇到了一个奇怪的情况,在Windows Server 2008上连续快速删除和创建目录会导致一些偶然的奇怪错误。有时我会收到IOException,有一次我有一个NotAuthorizedException 下面是我的代码,但在调试器中单步执行时,会抛出大量异常。事实上,在执行directory.delete时,我刚刚遇到了一个IOException“目录不是空的!” 更新 相当多的回复谈到了非原子目录创建和延迟写入等问题。是否有一种100%保证的方法来实现这一点?理想情况下,我希望一些系统调

我遇到了一个奇怪的情况,在Windows Server 2008上连续快速删除和创建目录会导致一些偶然的奇怪错误。有时我会收到IOException,有一次我有一个NotAuthorizedException

下面是我的代码,但在调试器中单步执行时,会抛出大量异常。事实上,在执行directory.delete时,我刚刚遇到了一个IOException“目录不是空的!”

更新 相当多的回复谈到了非原子目录创建和延迟写入等问题。是否有一种100%保证的方法来实现这一点?理想情况下,我希望一些系统调用是“DeleteDirectoryAndWaitForTheDirectoryToBeDeleted”,而相应的系统调用是“CreateDirectoryAndWaitForTheDirectoryToBeCreated”

另一次更新 我把Neil的代码放在下面,在我的机器上试了试,但很快就失败了(经过20次循环)。似乎发生的情况是,IDriveE服务可以访问该目录,并且尝试创建该目录失败,删除挂起。我想我需要做更多的研究,比如删除挂起

就我个人而言,我不喜欢这个代码,因为它“闻起来”不对——但它是有效的

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一直运行,直到得到错误而没有太多噪音。有趣的是,它在我的机器上失败了!