我在我的程序中使用boost::filesystem::is_directory()
,问题是当我使用选项-DBOOST_FILESYSTEM_VERSION=3
编译程序时,程序无法正常运行。升级版本为1.44.0。
具体来说,我通过以下命令构建文件系统库:
./bjam --toolset=gcc define=BOOST_FILESYSTEM_VERSION=3 --with-filesystem stage
我使用这样的命令构建我的程序。
g++ -I boost_1_44_0_folder test.cpp -o test boost_1_44_0_folder/stage/lib/libboost_filesystem.a boost_1_44_0_folder/stage/lib/libboost_system.a -DBOOST_FILESYSTEM_VERSION=3
当我执行./test时,结果是“不是dir”。
但是如果我用这样的命令构建我的程序。
g++ -I boost_1_44_0_folder test.cpp -o test boost_1_44_0_folder/stage/lib/libboost_filesystem.a boost_1_44_0_folder/stage/lib/libboost_system.a
当我执行./test时,结果是“是dir”。
我的测试代码如下所示。
test.cpp
#include <boost/filesystem.hpp>
#include <iostream>
using namespace std;
int main() {
namespace bf = boost::filesystem;
bf::path p("/home");
if (!boost::filesystem::is_directory(p)) {
cout << "is not dir" << endl;
} else {
cout << "is dir" << endl;
}
return 0;
}
答案 0 :(得分:0)
您可能还需要升级Boost版本。如果你看一下源代码(例如:http://svn.boost.org/svn/boost/trunk/boost/wave/util/filesystem_compatibility.hpp),1.0.46和1.0.50版本的文件系统处理有很多变化,很多代码看起来像这样:
#if BOOST_FILESYSTEM_VERSION >= 3
#if BOOST_VERSION >= 105000
return boost::filesystem::complete(p, base);
#else
return boost::filesystem3::complete(p, base);
#endif
#else
return boost::filesystem::complete(p, base);
#endif
FWIW,operations.cpp(http://svn.boost.org/svn/boost/trunk/libs/filesystem/src/operations.cpp)中的这段代码真让我烦恼:
// both stats now known to be valid
return s1.st_dev == s2.st_dev && s1.st_ino == s2.st_ino
// According to the POSIX stat specs, "The st_ino and st_dev fields
// taken together uniquely identify the file within the system."
// Just to be sure, size and mod time are also checked.
&& s1.st_size == s2.st_size && s1.st_mtime == s2.st_mtime;
因此,如果您正在检查两个文件是否与Boost实际上是同一个文件,并且它们实际上是相同的文件但是它被写入甚至只是touch
错误那一刻,Boost将返回文件本身不是。除了没有正确识别像简单目录这样常见的内容之外,这并没有让我对Boost文件系统实现的其余部分充满信心。