Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++ boost::filesystem::remove_all(路径)是如何工作的?_C++_Boost - Fatal编程技术网

C++ boost::filesystem::remove_all(路径)是如何工作的?

C++ boost::filesystem::remove_all(路径)是如何工作的?,c++,boost,C++,Boost,我试图使用boost::filesystem::remove_all(path)从特定路径中删除所有目录、子目录和包含的文件。我还想显示一条错误消息,以防文件在另一个程序中打开。在这种情况下,boost::filesystem::remove_all(path)是否引发异常 或者我还有别的方法可以做到这一点吗 这不适合评论,所以我将作为答案发布 只需查看来源: remove\u all\u aux是在上面几行定义的,remove\u file\u或\u directory,remove\u fi

我试图使用boost::filesystem::remove_all(path)从特定路径中删除所有目录、子目录和包含的文件。我还想显示一条错误消息,以防文件在另一个程序中打开。在这种情况下,boost::filesystem::remove_all(path)是否引发异常

或者我还有别的方法可以做到这一点吗

这不适合评论,所以我将作为答案发布

只需查看来源:

remove\u all\u aux
是在上面几行定义的,
remove\u file\u或\u directory
remove\u file
remove\u directory
等等。基本操作包括:

# if defined(BOOST_POSIX_API)
... 
#   define BOOST_REMOVE_DIRECTORY(P)(::rmdir(P)== 0)
#   define BOOST_DELETE_FILE(P)(::unlink(P)== 0)
...
# else  // BOOST_WINDOWS_API
...
#   define BOOST_REMOVE_DIRECTORY(P)(::RemoveDirectoryW(P)!= 0)
#   define BOOST_DELETE_FILE(P)(::DeleteFileW(P)!= 0)
...
# endif

删除锁定文件的行为取决于您的平台将提供什么。

这取决于您调用的
remove\u all
重载;这在功能的文档中有明确的记录。(不清楚的是,如果您使用通过错误代码报告错误的函数,该函数是否继续,还是在第一个错误后返回?

我将发布一些代码示例来澄清此问题。 有两种情况

在第一个场景中,我使用remove_all函数从某个路径删除整个目录,然后在同一路径上创建一个新目录:

try
{
if(exists(directory_path))
{
   remove_all(directory_path);
}
    create_directory(directory_path);   
}
catch(filesystem_error const & e)
{
    //display error message 
}
这与预期的一样有效,但我有第二个场景,我尝试从路径中删除某些文件夹,然后创建新目录:

try
    {
        if(exists(directory_path))
        {
            for ( boost::filesystem::directory_iterator itr(directory_path); itr != end_itr; itr++)
            {
                std::string folder = itr->path().filename().string();
                if(folder == FOLDER1 || folder == FOLDER2 || folder == FOLDER3)     
                      remove_all(itr->path());
            } 
         }          
        create_directory(directory_path);   
    }
    catch(filesystem_error const & e)
    {    
                 //display error message
    }

在这种情况下,如果文件在另一个程序中打开,则不会引发异常。文件刚被删除。为什么会发生这种情况

以下是相关的。看起来像是我的答案:)@LightnessRacesinOrbit我没有看到任何东西能够解决实际问题:当删除文件失败时,函数会做什么?@James:从外观上看返回
0
?文档中没有这样说。事实上,
remove\u all
有两个重载(就像
文件系统中的许多函数一样)
:一个引发异常,另一个获取存储错误代码的附加引用参数。我在下面发布了一些代码示例。第一个示例按预期工作,但第二个示例在使用文件时不会引发异常。什么操作系统?这是Linux上的预期行为,请看我使用的是Windows 7 OST。最可能的解释是,在删除文件时,该文件未真正打开。如果进程在文件上有句柄,则无法删除它。如果删除成功,我必须得出结论,没有任何进程可以处理您的任何文件。在相同的条件下,为什么在我的第一个示例中它可以工作,而在我的第二个示例中却不能工作?我想不出来。。
try
    {
        if(exists(directory_path))
        {
            for ( boost::filesystem::directory_iterator itr(directory_path); itr != end_itr; itr++)
            {
                std::string folder = itr->path().filename().string();
                if(folder == FOLDER1 || folder == FOLDER2 || folder == FOLDER3)     
                      remove_all(itr->path());
            } 
         }          
        create_directory(directory_path);   
    }
    catch(filesystem_error const & e)
    {    
                 //display error message
    }