Windows API函数CopyFile有一个参数BOOL bFailIfExists,允许您控制是否要覆盖目标文件(如果存在).
该boost::filesystem copy_file函数没有这样的参数,如果目标文件存在则会失败.是否有一种优雅的方式来使用boost copy_file函数并覆盖目标文件?或者仅仅使用Windows API更好吗?我目前的目标平台是Windows,但我更喜欢使用STL并在可能的情况下增强以保持我的代码平台独立.
谢谢.
我应该如何使用directory_iterator列出目录文件(不是递归)?
我应该添加/链接什么头文件/库或我应该做的其他设置?我在我的项目中使用了boost,但directory_iterator出于某种原因是"声称不足的标识符",而我可以使用其他的boost功能.
更新
另一种方案:
#include <filesystem>
#include <boost/filesystem.hpp>
#include <iostream>
using namespace boost::filesystem;
for (directory_iterator itr(path_ss); itr!=directory_iterator(); ++itr)
{
cout << itr->path().filename() << ' '; // display filename only
if (is_regular_file(itr->status())) cout << " [" << file_size(itr->path()) << ']';
cout << '\n';
}
Run Code Online (Sandbox Code Playgroud) 我有两个绝对文件系统路径(A和B),我想生成第三个文件系统路径,表示"B的相对".
使用案例:
boost::filesystem似乎必须complete解决relative ~ relative => absolute,但在reverse(absolute ~ absolute => relative)中没有做任何事情.
我想用Boost路径来做.
该boost::filesystem库的哪些方法可以帮助我获得相对于另一条路径的路径?
我有一条路/home/user1/Downloads/Books和一条路/home/user1/.现在我想要一条路Downloads/Books.
我需要一个文件系统库,用于支持C++ 11的编译器或支持C++ 14的编译器 - 所以它不能来自C++ 17.
现在,我知道进入C++ 17的文件系统库是基于Boost :: Filesystem的; 但是 - 它们是否足够相似,我可以使用Boost库,然后在以后无缝切换到标准版本,而不会更改,比如using声明?或两者之间是否存在(轻微/重大)差异?我知道,对于这种情况variant,Boost和标准库版本有很大不同.
std::filesystem在C++ 17上,std::experimental::filesystem对于许多前C++ 17编译器来说,基于boost::filesystem并且几乎所有它都很明显地移植到较新的std.
但我认为不std::filesystem相同boost::filesystem::unique_path().
我没有注意到std中的等价物吗?或者我是否应该采用一种推荐的方法来模仿实现?
boost::filesystem当我的代码注意到它在支持的平台上进行编译时,我真的希望能够替换依赖std::filesystem,并且unique_path()是我转换中唯一不明显的部分.
什么是扩展的最佳方式
${MyPath}/filename.txt to /home/user/filename.txt
Run Code Online (Sandbox Code Playgroud)
要么
%MyPath%/filename.txt to c:\Documents and settings\user\filename.txt
Run Code Online (Sandbox Code Playgroud)
遍历遍历路径字符串直接寻找环境变量?我看到wxWidgets有一个wxExpandEnvVars函数.在这种情况下我不能使用wxWidgets,所以我希望找到一个boost :: filesystem等价或类似的.我只使用主目录作为示例,我正在寻找通用路径扩展.
我正在使用boost文件系统获取当前目录的路径,然后检查目录是否存在.
is_directory()exists()没问题,但在相同的路径上失败了,我错过了什么吗?
示例代码(boost 1.35):
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
namespace fs = boost::filesystem;
// the path is full path /home/my/somedirectory
fs::path data_dir(fs::current_path());
fs::is_directory(data_dir) // true, directory exists
fs::exists(data_dir) // false
exists(status(data_dir)) // false
Run Code Online (Sandbox Code Playgroud)
编辑:
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
namespace fs = boost::filesystem;
fs::path data_dir(fs::current_path());
// data_dir == "/home/myusername/proj/test"
if (fs::is_directory(data_dir)) // true - is directory
if (fs::is_directory(fs::status(data_dir))) // true - it is still a directory
Run Code Online (Sandbox Code Playgroud)
有趣的部分:
if (fs::exists(fs::status(data_dir))) // true - directory exists
if (fs::exists( data_dir )) // true …Run Code Online (Sandbox Code Playgroud) 我不知道为什么boost::filesystem::copy_file要为我制造麻烦.
未定义的引用`boost :: filesystem :: detail :: copy_file
// g++ -std=c++11 test.cpp -lboost_filesystem -lboost_system -lrt -lboost_wave
#include <boost/filesystem.hpp>
int main()
{
boost::filesystem::create_directory("aaa");
// ok
boost::filesystem::copy_file("f1","f2");
// /tmp/ccNWZltB.o: In function `boost::filesystem::copy_file(boost::filesystem::path const&, boost::filesystem::path const&)':
// test.cpp:(.text._ZN5boost10filesystem9copy_fileERKNS0_4pathES3_[_ZN5boost10filesystem9copy_fileERKNS0_4pathES3_]+0x26): undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)'
// collect2: error: ld returned 1 exit status
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我从boost的源代码或它的帮助中得不到灵感:
inline
void copy_file(const path& from, const path& to, // See ticket #2925
BOOST_SCOPED_ENUM(copy_option) option, system::error_code& ec)
{detail::copy_file(from, to, option, &ec);} …Run Code Online (Sandbox Code Playgroud) 你可以使用boost :: filesystem和BOOST_FOREACH迭代目录中的所有文件吗?我试过了
path dirPath = ...
int fileCount = 0;
BOOST_FOREACH(const path& filePath, dirPath)
if(is_regular_file(filePath))
++fileCount;
Run Code Online (Sandbox Code Playgroud)
此代码编译,运行,但不会产生所需的结果.