C++ 删除目录及其所有子目录
我写了一个函数,应该删除一个目录和其中的所有文件和文件夹,但它得到了一些麻烦。 对于我的目标,我为实验制作了专门的目录。此目录存储一些文件和一个文件夹。这个文件夹(子目录)也包含1或2个文件。My函数成功删除子目录及其所有文件。主目录中的所有文件也被成功删除。但是当函数开始删除主目录时,它失败了。似乎rmdir返回的不是0,我不知道为什么,因为子目录删除得很好 作为参数,它使用类似于“D:\new\”的字符串 其中new是主目录,应该删除其中的所有内容。 以下是此函数的代码:C++ 删除目录及其所有子目录,c++,windows,file-io,C++,Windows,File Io,我写了一个函数,应该删除一个目录和其中的所有文件和文件夹,但它得到了一些麻烦。 对于我的目标,我为实验制作了专门的目录。此目录存储一些文件和一个文件夹。这个文件夹(子目录)也包含1或2个文件。My函数成功删除子目录及其所有文件。主目录中的所有文件也被成功删除。但是当函数开始删除主目录时,它失败了。似乎rmdir返回的不是0,我不知道为什么,因为子目录删除得很好 作为参数,它使用类似于“D:\new\”的字符串 其中new是主目录,应该删除其中的所有内容。 以下是此函数的代码: void oper
void operations with directories::RemovingCycle(字符串路径)
{
string wayToFile;//用于保存无掩码目录的路径的字符串
string deletedFile;//保存删除文件方法的字符串
wayToFile=\u路径;
_path+=“**”;//向路径字符串添加掩码
_finddata\u t*fileinfo=new\u finddata\u t;
longdone=\u findfirst(\u path.c\u str(),fileinfo);
int IsContinue=完成;
while(IsContinue!=-1)
{
deletedFile=wayToFile+fileinfo->name;
如果(fileinfo->attrib==\u A\u SUBDIR)
{
如果(strcmp(fileinfo->name,“.”)=0&&strcmp(fileinfo->name,“…”)!=0)
{
cout name+“\\”;//如果存在子目录,将启动递归函数
cout这是在Windows下吗?尤其是在Windows中,问题是如果您删除文件或子文件夹,它不会立即删除,而是“将来某个时候”异步删除。这可能需要相当长的时间,尤其是当有人仍然打开一些文件句柄时。即使没有,如果您的程序“太快”(或在重载下的文件系统),当您尝试删除父文件夹时,内容可能尚未实际删除,调用失败
通常,这可以通过将每个子文件和子文件夹移动到某个临时位置(在同一分区!),然后将其删除来解决。这样,父文件夹将为空且可删除,即使内容尚未“物理”删除(因为所有内容都已移到外部-移动是同步的)
有关更多信息,请参见本讲座:
一般来说,正确地处理文件系统并不是那么简单,而且存在大量的竞争条件空间
如果您在删除每个文件夹之前进行睡眠(比如200毫秒),以查看给系统一些时间删除内容是否“解决”了问题(但这不是一个“真正的解决方案”,只是查看它确实是一个时间问题),则可以确认此问题
请注意,如果您移动和删除并且您的程序在实际删除发生之前终止,这不是一个问题-一旦删除成功返回,Windows操作系统将注意删除文件。如果这是Windows,为什么不使用必要的Windows API函数删除目录?另外,我建议您在对于调试器,一次单步执行,尤其是对于这样的情况。为什么?如果出现问题,例如变量设置不正确,并且因此,您开始删除您不想删除的目录,该怎么办?是的,当然,我在调试器下运行此代码。删除错误的目录肯定会很痛苦。about API…我现在甚至不知道在学习中使用这些东西对不对,因为我是初学者,我正在尝试学习cpp的基本知识。如果您的编译器足够支持标准文件系统技术规范,这可能非常简单:是的,它在Windows下。谢谢您的回答!我现在就尝试这样做。或者我n不要将内容移动到临时位置,您可以通过检查它是否存在来等待它被删除,然后继续。等待的问题是,很难说它实际何时被删除,因此可能需要不必要的等待(有时,如果某些程序持有句柄,等待一分钟或更长的时间也可能无济于事。)谢谢axalis!目录移动的方法非常有效!
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";