我正在使用boost文件系统来替换像CopyFile和MoveFile这样的Windows C++函数,以便在windows和linux之间获得某种可移植性.我正在使用copy_file,但我无法找到任何移动文件,如'move_file'函数.boost有移动文件功能吗?
我非常希望使用boost,但欢迎提供其他建议.
有没有办法使用Boost.Filesystem获取平台的路径分隔符?通过路径分隔符,我的意思/是Unix和\Windows.
我已经知道我可以使用boost::filesystem::path::operator/连接适当的分隔符来连接两个路径.但我只想要/或者\.
我也知道我可以使用#ifdef _WIN32,但我更喜欢Boost.Filesystem告诉我适当的分隔符.
编辑:我想使用Boost.Filesystem API的第3版,如Boost 1.48中所使用的.
我一直在寻找高低,以解决这个问题,我似乎无法调试问题!
所以,这就是我所拥有的.
我通过自制软件(Mac OSX Mavericks)1.55.0安装了boost.
其他boost库工作正常,但boost::filesystem似乎无法与实际文件系统交互.
这是我如何链接它(使用QT)
macx: LIBS += -L$$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/ -lboost_system-mt
macx: LIBS += -L$$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/ -lboost_filesystem-mt
INCLUDEPATH += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/include
DEPENDPATH += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/include
macx: PRE_TARGETDEPS += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/libboost_filesystem.a
macx: PRE_TARGETDEPS += $$PWD/../../../../../usr/local/Cellar/boost/1.55.0_1/lib/libboost_system.a
Run Code Online (Sandbox Code Playgroud)
请注意,这是由qt creator通过Add Library界面自动生成的.
这是我正在运行的代码永远不会有效.(意思是总是false)
namespace fs = boost::filesystem;
boost::system::error_code c;
fs::path path("/path/to/some/dir"); // Have tried '.' '/' './' '/usr' Everything!
bool isDir = boost::filesystem::is_directory(path, c);
if(!isDir) {
std::cout << "Error Response: " << c << std::endl;
ui->directoryEdit->setStyleSheet("background-color: red;");
}
else {
std::cout << "Is a …Run Code Online (Sandbox Code Playgroud) 所以我运行我的应用程序.我需要知道它的可执行文件在哪里.如何使用Boost.Filesystem找到它的路径?
我正在使用boost :: filesystem :: remove_all操作来删除目录的内容.
它正确删除了内容,但是,作为Boost Filesystem Documentation的状态,它也会删除目录本身.
有没有一个简单的方法来保持目录,尽管它是空的?
我正在使用Boost Filesystem库.我有一条路
boost::filesystem::path P("/foo/bar.baz");
Run Code Online (Sandbox Code Playgroud)
我想将路径p的词干部分修改为"bar_quz",因此路径P保持不变
/foo/bar_quz.baz
有人能帮我吗?谢谢
boost::filesystem::canonical(const path& p)各州的文件:
概述:将必须存在的p转换为没有符号链接,点或点点元素的绝对路径.
...
备注:!exists(p)是一个错误.
其结果是,如果p标识其目标不存在的符号链接,则该函数将失败file not found并且不返回路径.
这对我来说似乎过于严格:仅仅因为链接的目标不存在,我认为没有理由为什么该函数无法解析该不存在的目标的路径.(相比之下,absolute()没有这样的限制.)
(显然,如果一个符号链接内的路径被打破,目标路径不能被解决.)
那么,这种限制是否有正当理由?
即使存在,是否也没有理由创建没有此限制的函数变体?(如果没有这样的变体,获取路径需要容易出错的手动复制canonical()已经完成的99%.)
我理解在这种情况之间存在的语义细微之处stat()并且lstat()同样适用于这种情况 - 这正是我认为函数变体同样合理的原因.
注意:这个问题同样适用于基于的std::experimental::filesystem库(n4100)boost::filesystem.
编辑:
在@Jonathan Wakeley下面非常知识渊博的答案之后,我仍然留下了原始问题的精髓,我将稍微重新思考:
是否有一个基本的技术或逻辑上的理由,为什么boost::filesystem::canonical()要求目标存在?我的意思是,目标的不存在是否会使得无法解决规范形式的道路?
如果没有,是否有任何技术或逻辑上的理由不提出,只有从现有的形式,不同之处在于它的功能的变化不要求目标存在?
在boost::filesystem提议的N4100 的转换中(据我理解的情况)std::experimental::filesystem,是否canonical()经过适当的考虑后采用了这种限制,还是仅仅从Boost定义中"落后"?
编辑2:
我注意到Boost 1.60现在提供了这样的功能weakly_canonical():"返回p,symlinks已解析,结果归一化.返回:一个路径,由在canonical()p的前导元素组成的路径上调用函数的结果组成,如果有,则按照由p的元素,如果有的话,不存在."
编辑3:
这更多的讨论有关std::filesystem.
考虑以下关于路径分解的断言,其中每个局部变量例如stem具有明显的初始化,例如auto stem = path.stem()-
assert(root_path == root_name / root_directory);
assert(path == root_name / root_directory / relative_path);
assert(path == root_path / relative_path);
assert(path == parent_path / filename);
assert(filename == stem + extension);
Run Code Online (Sandbox Code Playgroud)
这一切都有效,除了最后一行 - 因为fs::path没有定义operator+.它有operator+=,但没有operator+.
这是什么故事?
我已经确定我可以通过添加自己的代码来编译代码operator+.有什么理由不这样做吗?(请注意,这是在我自己的命名空间中;我没有重新打开namespace std.)
fs::path operator+(fs::path a, const fs::path& b)
{
a += b;
return a;
}
Run Code Online (Sandbox Code Playgroud)
我对这个问题的唯一假设是:
也许设计师担心operator+会太容易混淆使用std::string的operator+.但这看起来很愚蠢,因为它在语义上完全相同(所以为什么要关心它是否会混淆?).而这也似乎设计师不关心新手的困惑,当他们设计path.append("x")做一些语义不同的str.append("x")和 …
我想遍历目录中的所有文件并打印其内容.Boost非常好地处理迭代部分,但我不知道如何将其转换为const char *.
boost::filesystem::directory_iterator path_it(path);
boost::filesystem::directory_iterator end_it;
while(path_it != end_it){
std::cout << *path_it << std::endl;
// Convert this to a c_string
std::ifstream infile(*path_it);
}
Run Code Online (Sandbox Code Playgroud)
我试着阅读这个文档,但找不到像string或的东西c_str().我是两个人的新手C++,boost并希望找到一些javadoc类似的文档,基本上可以告诉我成员是什么以及可用的功能而不是转储源代码.
对不起咆哮,但有人可以告诉我如何转换*path_it为c string.
如何确定文件是否包含在boost文件系统v3的路径中.
我看到有一个更小或更大的运算符,但这似乎只是词汇.我看到的最好的方法如下:
有没有更好的方法来做到这一点?