繁体   English   中英

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

[英]removing directories and all sub-directories in it

我写了一个函数,它应该删除一个目录及其中的所有文件和文件夹,但它有一些麻烦。 对于我的目标,我为实验制作了特殊目录。 此目录存储一些文件和一个文件夹。 此文件夹(子目录)还包含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中,问题在于,如果删除文件或子文件夹,则不会立即删除它,而是“在将来的某个时间”异步删除。 这可能需要相当长的时间,特别是如果有人仍然打开一些文件句柄。 即使没有,如果您的程序“太快”(或文件系统负载很重),当您尝试删除父文件夹时,内容可能尚未实际删除,并且调用失败。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM