我写了一个函数,它应该删除一个目录及其中的所有文件和文件夹,但它有一些麻烦。 对于我的目标,我为实验制作了特殊目录。此目录存储一些文件和一个文件夹。此文件夹(子目录)还包含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";
}
答案 0 :(得分:5)
这是在Windows下吗?特别是在Windows中,问题在于,如果删除文件或子文件夹,则不会立即删除它,而是“在将来的某个时间”异步删除。这可能需要相当长的时间,特别是如果有人仍然打开一些文件句柄。即使没有,如果您的程序“太快”(或文件系统负载很重),当您尝试删除父文件夹时,内容可能尚未被实际删除,并且调用失败。
通常,这可以通过将每个子文件和子文件夹移动到某个临时位置(在同一个分区上!),然后将其删除来解决。这样父文件夹将为空并且可删除,即使内容尚未“物理”删除(因为所有内容都已移到外面 - 移动是同步的)。
您可以通过以下方式查看此演讲:https://youtu.be/uhRWMGBjlO8?t=7m30s
一般来说,正确处理文件系统并不是那么简单,竞争条件还有很多空间。
如果您在删除每个文件夹之前进行睡眠,可以说确认这个问题,比如200ms,看看是否给系统一些时间来删除内容“解决”问题(但这不是“真正的解决方案”,只是看到它确实是一个时间问题。)
请注意,如果移动并删除并且程序在实际删除之前终止,则不会出现问题 - 一旦删除成功,Windows操作系统将会关注该文件将被删除。