Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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::递归目录迭代器多线程安全_C++_Multithreading_Boost_Thread Safety - Fatal编程技术网

C++ boost::filesystem::递归目录迭代器多线程安全

C++ boost::filesystem::递归目录迭代器多线程安全,c++,multithreading,boost,thread-safety,C++,Multithreading,Boost,Thread Safety,我有一个程序,它至少使用两个线程在一个目录上运行。一个是从中添加和删除文件,另一个是按如下方式计算其大小: #include <boost/filesystem.hpp> #include <iostream> int main() { namespace fs = boost::filesystem; size_t size=0; if(fs::exists("/home/user/Documents/my_directory") &&

我有一个程序,它至少使用两个线程在一个目录上运行。一个是从中添加和删除文件,另一个是按如下方式计算其大小:

#include <boost/filesystem.hpp>
#include <iostream>

int main()
{
    namespace fs = boost::filesystem;
    size_t size=0;
    if(fs::exists("/home/user/Documents/my_directory") && fs::is_directory("/home/user/Documents/my_directory"))
    {
        try{
            for(auto entry: fs::recursive_directory_iterator("/home/user/Documents/my_directory"))
            {
                if(fs::is_regular_file(entry.status()))
                {
                    size += fs::file_size(entry);
                }
            }
        }
        catch(boost::filesystem::filesystem_error e)
        {
            std::cout << e.code() << std::endl;
            std::cout << e.what() << std::endl;
            std::cout << e.path1() << std::endl;
            std::cout << e.path2() << std::endl;
            return 0;
        }
    }
    std::cout << size << std::endl;
    return 0;
}
#包括
#包括
int main()
{
名称空间fs=boost::filesystem;
大小\u t大小=0;
if(fs::exists(“/home/user/Documents/my_directory”)&&fs::is_directory(“/home/user/Documents/my_directory”))
{
试一试{
for(自动输入:fs::recursive\u directory\u迭代器(“/home/user/Documents/my\u directory”))
{
if(fs::is_regular_文件(entry.status()))
{
size+=fs::文件大小(条目);
}
}
}
捕获(boost::filesystem::filesystem\u错误e)
{

std::cout最简单的解决方案是忽略任何错误:

#include <boost/filesystem.hpp>
#include <iostream>

int main()
{
    namespace fs = boost::filesystem;
    uintmax_t size=0;
    if(fs::exists("/home/user/Documents/my_directory") && fs::is_directory("/home/user/Documents/my_directory"))
    {
        try{
            for(auto entry: fs::recursive_directory_iterator("/home/user/Documents/my_directory"))
            {
                if(fs::is_regular_file(entry.status()))
                {
                    boost::system::error_code ec;
                    uintmax_t fileSize = fs::file_size(entry, ec);
                    if (!ec)
                    {
                        size += fileSize;
                    }
                }
            }
        }
        catch(boost::filesystem::filesystem_error e)
        {
            std::cout << e.code() << std::endl;
            std::cout << e.what() << std::endl;
            std::cout << e.path1() << std::endl;
            std::cout << e.path2() << std::endl;
            return 0;
        }
    }
    std::cout << size << std::endl;
    return 0;
}
#包括
#包括
int main()
{
名称空间fs=boost::filesystem;
uintmax\u t size=0;
if(fs::exists(“/home/user/Documents/my_directory”)&&fs::is_directory(“/home/user/Documents/my_directory”))
{
试一试{
for(自动输入:fs::recursive\u directory\u迭代器(“/home/user/Documents/my\u directory”))
{
if(fs::is_regular_文件(entry.status()))
{
boost::system::error_code ec;
uintmax\u t fileSize=fs::file\u size(条目,ec);
如果(!ec)
{
大小+=文件大小;
}
}
}
}
捕获(boost::filesystem::filesystem\u错误e)
{

std::不能捕获并忽略错误并继续下一个文件?或者,由于您预期会出现错误,因此最好将重载与错误代码一起使用,而不是使用Exceptions。因此,您建议应该使用continue语句,而不是返回0?我不能这样做,因为try被包装在for循环上。您是否也可以支持提供错误代码重载的解决方案?不起作用,仍然得到boost::filesystem::directory\u iterator::operator++:错误的文件描述符:“/home/user/Documents/my\u directory”