Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除目录及其所有子目录_C++_Windows_File Io - Fatal编程技术网

C++ 删除目录及其所有子目录

C++ 删除目录及其所有子目录,c++,windows,file-io,C++,Windows,File Io,我写了一个函数,应该删除一个目录和其中的所有文件和文件夹,但它得到了一些麻烦。 对于我的目标,我为实验制作了专门的目录。此目录存储一些文件和一个文件夹。这个文件夹(子目录)也包含1或2个文件。My函数成功删除子目录及其所有文件。主目录中的所有文件也被成功删除。但是当函数开始删除主目录时,它失败了。似乎rmdir返回的不是0,我不知道为什么,因为子目录删除得很好 作为参数,它使用类似于“D:\new\”的字符串 其中new是主目录,应该删除其中的所有内容。 以下是此函数的代码: void oper

我写了一个函数,应该删除一个目录和其中的所有文件和文件夹,但它得到了一些麻烦。 对于我的目标,我为实验制作了专门的目录。此目录存储一些文件和一个文件夹。这个文件夹(子目录)也包含1或2个文件。My函数成功删除子目录及其所有文件。主目录中的所有文件也被成功删除。但是当函数开始删除主目录时,它失败了。似乎rmdir返回的不是0,我不知道为什么,因为子目录删除得很好

作为参数,它使用类似于“D:\new\”的字符串

其中new是主目录,应该删除其中的所有内容。 以下是此函数的代码:

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";