删除目录及其所有子目录

3
我写了一个函数,它应该删除一个目录及其中所有的文件和文件夹,但是它出了一些问题。为了测试这个函数,我特意创建了一个实验目录,该目录包含一些文件和一个子目录。而这个子目录也包含1或2个文件。我的函数成功地删除了子目录及其中的所有文件。并且主目录中的所有文件也被成功删除了。但当函数开始尝试删除主目录时,它却失败了。似乎rmdir返回的不是0,我不知道为什么,因为子目录可以成功删除。 作为参数,它接受像"D:\new\"这样的字符串。 这里的new是应该与其中所有内容一起删除的主目录。下面是这个函数的代码:
 void OperationsWithDirectories::RemovingCycle(string _path)
    {
        string wayToFile;           // string to hold the path to the directory without mask 
        string deletedFile;         // string which would hold the way to deleting file
        wayToFile = _path;

        _path += "*.*";             // add a mask to the _path string


        _finddata_t* fileinfo = new _finddata_t;

        long done = _findfirst(_path.c_str(), fileinfo);

        int IsContinue = done;

while (IsContinue != -1)
{
    deletedFile = wayToFile + fileinfo->name;

    if (fileinfo->attrib == _A_SUBDIR)
    {
        if (strcmp(fileinfo->name, ".") != 0 && strcmp(fileinfo->name, "..") != 0)
        {
            cout << "\nEnter subdirectory\n";
            RemovingCycle(wayToFile + fileinfo->name + "\\");       //recursive func wich would start, if subdirectory is exist
            cout << "\nOutta subdirectory\n";
        }
    }
    else
    {
        if ((remove(deletedFile.c_str())) != 0)
            cout << "\n\n ERROR IN FILE DELETING\n\n";
        else
            cout << endl << deletedFile << " - was deleted";
    }

    IsContinue = _findnext(done, fileinfo);
}

if ((_rmdir(wayToFile.c_str())) != 0)
    cout << "\n\nERROR IN DIRECT - " << wayToFile << " DELETING\n\n";
else
    cout << "\ndir - " << wayToFile << " was deleted succesfully\n";

}


如果这是Windows系统,为什么不使用必要的Windows API函数来删除目录?https://msdn.microsoft.com/en-us/library/windows/desktop/bb762164%28v=vs.85%29.aspx 此外,我建议您在调试器下逐步执行此操作,特别是像这样的操作。为什么呢?如果出现问题,例如变量设置不正确,因此开始删除您不想删除的目录,那该怎么办呢? - PaulMcKenzie
是的,当然,我在调试器下运行这段代码。删除错误目录肯定会很痛苦。至于API……我甚至不知道在学习中是否应该使用这些东西,因为我是初学者,正在尝试学习C++的基础知识。 - BrainOverflow
如果您的编译器足够更新以支持标准文件系统技术规范,则这可能非常简单:http://en.cppreference.com/w/cpp/experimental/fs/remove - Galik
1个回答

5
这是在Windows下吗?特别是在Windows中,问题在于如果您删除一个文件或子文件夹,它不会立即被删除,而是异步地“在未来某个时候”被删除。这可能需要一些时间,尤其是如果有人仍然打开了某些文件句柄。即使没有,如果您的程序“太快”(或者文件系统负载过重),当您尝试删除父文件夹时,内容可能尚未实际被删除,因此调用失败。
通常通过将每个子文件和子文件夹移动到某个临时位置(在同一分区中!)来解决这个问题,然后再删除它们。这样,父文件夹将为空并可删除,即使内容尚未被“物理”删除(因为所有内容已经移动到外部 - 移动是同步的)。
您可以查看此演讲以获取更多信息:https://youtu.be/uhRWMGBjlO8?t=7m30s 总的来说,正确处理文件系统确实并不简单,并且存在很多竞争条件的空间。
如果在删除每个文件夹之前放置一个休眠,比如200毫秒,您可以确认此问题,以查看是否给系统一些时间来删除内容“解决”了问题(但这不是“真正的解决方案”,只是为了看到确实存在时间问题)。
请注意,如果您在移动和删除后立即终止程序,则不会出现问题 - 一旦删除成功,Windows操作系统将负责删除该文件。

是的,它在Windows下。谢谢您的回答!我现在会尝试这样做。 - BrainOverflow
作为另一种选择,你可以等待内容被删除,通过检查其是否存在来继续操作,而不是将其移动到临时位置。 - Tomasz Kasperczyk
1
等待的问题在于很难确定何时实际上被删除,因此可能需要不必要的等待(即使等待一分钟或更长时间有时也无法帮助,如果某个程序正在持有句柄)。 - EmDroid
谢谢axalis!目录移动的方法很管用! - BrainOverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接