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”