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

我写了一个函数,它应该删除一个目录及其中的所有文件和文件夹,但它有一些麻烦。 对于我的目标,我做了专门的实验目录。 该目录存储一些文件和一个文件夹。 而这个文件夹(子目录)也包含1或2个文件。 我的function成功删除子目录和其中的所有文件。 并且主目录中的所有文件也都被删除。 但是,当function开始删除主目录 – 它失败。 看起来像rmdir返回不是0,我不知道为什么,导致子目录移除良好。

作为一个参数,它需要像“D:\ new \”这样的string。

哪里是新的主目录,应该删除它的一切。 这里是这个函数的代码:

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操作系统将会注意文件将被删除。