gpt4 book ai didi

c++ - 删除目录及其中的所有子目录

转载 作者:可可西里 更新时间:2023-11-01 14:48:50 58 4
gpt4 key购买 nike

我写了一个函数,它应该删除一个目录及其中的所有文件和文件夹,但它遇到了一些麻烦。对于我的目标,我制作了专门的实验目录。该目录存放一些文件和一个文件夹。而这个文件夹(子目录)也包含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

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

如果您在删除每个文件夹之前先休眠,假设 200 毫秒,看看是否给系统一些时间删除内容“解决”了这个问题,您可以确认这个问题(但这不是“真正的解决方案”,只是看到确实是时间问题)。

请注意,如果您移动并删除并且您的程序在实际删除发生之前终止,这不是问题 - 一旦删除成功返回,Windows 操作系统将注意删除该文件。

关于c++ - 删除目录及其中的所有子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35319412/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com