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

Bra*_*low 3 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";
Run Code Online (Sandbox Code Playgroud)

}

axa*_*lis 5

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

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

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

一般来说,正确处理文件系统并不是那么简单,并且竞争条件有很大的空间.

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

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