删除目录及其中的所有子目录

时间:2016-02-10 15:35:29

标签: c++ windows file-io

我写了一个函数,它应该删除一个目录及其中的所有文件和文件夹,但它有一些麻烦。 对于我的目标,我为实验制作了特殊目录。此目录存储一些文件和一个文件夹。此文件夹(子目录)还包含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";

}

1 个答案:

答案 0 :(得分:5)

这是在Windows下吗?特别是在Windows中,问题在于,如果删除文件或子文件夹,则不会立即删除它,而是“在将来的某个时间”异步删除。这可能需要相当长的时间,特别是如果有人仍然打开一些文件句柄。即使没有,如果您的程序“太快”(或文件系统负载很重),当您尝试删除父文件夹时,内容可能尚未被实际删除,并且调用失败。

通常,这可以通过将每个子文件和子文件夹移动到某个临时位置(在同一个分区上!),然后将其删除来解决。这样父文件夹将为空并且可删除,即使内容尚未“物理”删除(因为所有内容都已移到外面 - 移动是同步的)。

您可以通过以下方式查看此演讲:https://youtu.be/uhRWMGBjlO8?t=7m30s

一般来说,正确处理文件系统并不是那么简单,竞争条件还有很多空间。

如果您在删除每个文件夹之前进行睡眠,可以说确认这个问题,比如200ms,看看是否给系统一些时间来删除内容“解决”问题(但这不是“真正的解决方案”,只是看到它确实是一个时间问题。)

请注意,如果移动并删除并且程序在实际删除之前终止,则不会出现问题 - 一旦删除成功,Windows操作系统将会关注该文件将被删除。