代码之家  ›  专栏  ›  技术社区  ›  Nick Randell

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

  •  4
  • Nick Randell  · 技术社区  · 17 年前

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

    这是我的代码,它可以工作,但在调试器中遍历时,会抛出许多异常。事实上,我刚刚在执行directory.delete时遇到了IOException,其中显示“目录不为空”!

    一个更新 我把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);
        }
    }
    

    我的怀疑是,监视文件系统会导致某些操作延迟,但我不知道是什么。

    5 回复  |  直到 17 年前
        1
  •  4
  •   Mark Ingram    17 年前

    当你从文件系统中删除一个项目时,它不会立即删除它——它会标记它在以后删除(如果目录包含子文件夹/文件,它也会抛出异常)。

        2
  •  2
  •   Ankit    17 年前

    Windows还使用了一种叫做“延迟写入”的东西。因此,如果你删除一个目录,它不会立即被删除,只是被标记为删除。

        3
  •  2
  •   anon anon    17 年前

    以下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;
        }
    }
    
        4
  •  2
  •   JP Alioto    17 年前

    使用 FileSystemWatcher 捕获删除操作,然后创建新目录。

        5
  •  0
  •   Douglas Leeder    17 年前

    问题是删除目录及其所有内容不是原子操作。因此,如果在删除代码“清除”目录后,有任何其他内容将文件添加到目录中,则删除目录可能会失败。

    您可能希望对循环进行计数,以便在删除或创建过程中出现真正的问题时不会挂起。