Boost filesystem

Posted by YuCong on September 25, 2020

[TOC]

Boost filesystem

Created 2020.09.25 by William Yu; Last modified: 2020.09.25-V1.0.0

Contact: windmillyucong@163.com

Copyleft! 2021 William Yu. Some rights reserved.


boost filesystem

Reference

  • http://zh.highscore.de/cpp/boost/filesystem.html

Basic Concepts

安装
  • https://blog.csdn.net/dulingwen/article/details/90693392
1
2
3
4
5
6
# 下载 https://www.boost.org/

tar -zxvf ./boost.tar.gz
cd ./boost_1_70_0
sudo ./bootstrap.sh
sudo ./b2 install
头文件
1
2
3
#include <boost/filesystem.hpp>

using namespace boost::filesystem
编译
1. g++编译

编译的时候需要链接

1
-lboost_filesystem

如果不是标准路径,编译添加boost库文件与动态路径

1
2
-I $(BOOST)/include/
-L $(BOOST)/lib/
2. cmake 编译
  • https://cmake.org/cmake/help/latest/module/FindBoost.html
1
2
3
4
5
6
7
8
9
10
11
find_package(Boost REQUIRED COMPONENTS context system log)
if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})    
    MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
    MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}.")
    MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}.")
    # build exe
    add_executable(${EXE_NAME} ${src})
    # link libraries
    target_link_libraries(${EXE_NAME} ${Boost_LIBRARIES})
endif()

Path

boost::filesystem::path 类,提供路径表示与处理的方法

path 的构建
1
2
3
path dir("C:\Windows");  // 由字符串构建路径
dir /= "System32";    //  /= 表示追加下级目录   += 只表示字符串拼接
dif /= "test.exe";
path提供的方法
1
2
3
4
5
6
7
8
9
10
11
12
std::cout << dir.string() << std::endl;            //转换成std::string 类型
std::cout << dir.file_string() << std::endl; 
std::cout << dir.directory_string() << std::endl;

std::cout << dir.root_name()<< std::endl;          //根目录命 盘符名
std::cout << dir.root_directory()<< std::endl;     //根目录:"\"
std::cout << dir.root_path()<< std::endl;          //根路径:"C:\"
std::cout << dir.relative_path()<< std::endl;      //相对路径:Windows\System32\services.exe
std::cout << dir.parent_path()<< std::endl;        //上级目录:C:\Windows\System32
std::cout << dir.filename()<< std::endl;           //文件名:services.exe
std::cout << dir.stem()<< std::endl;               //不带扩展的文件名:services
std::cout << dir.extension()<< std::endl;          //扩展名:.exe

常用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 以下均在boost::filesystem::命名空间之下

create_directories(const Path & p);//  建立路径
bool create_directory(const Path& dp);//  建立路径 
system_complete(path);   // 返回完整路径(相对路径+当前路径) 
initial_path();             //  得到程序运行时的系统当前路径 
current_path();             //  得到系统当前路径
complete(const Path& p, const Path& base=initial_path<Path>());// 以base以基,p作为相对路径,返回其完整路径 
current_path(const Path& p);//  改变当前路径 

exists(path);            // 判断目录是否存在 
is_directory(path);      // 判断是否是路径 
is_regular_file(path);   // 判断是否是普通文件 
is_symlink(path);        // 判断是否是一个链接文件 
create_hard_link(const Path1& to_p, const Path2& from_p);// 
error_code create_hard_link(const Path1& to_p, const Path2& from_p, error_code& ec);// 建立硬链接 
create_symlink(const Path1& to_p, const Path2& from_p);// 
create_symlink(const Path1& to_p, const Path2& from_p, error_code& ec);// 建立软链接 

file_status status(path);   //  返回路径名对应的状态

space_info space(const Path& p);// 得到指定路径下的空间信息,space_info 有capacity, free 和 available三个成员变量,分别表示容量,剩余空间和可用空间。 

last_write_time(const Path& p);        //  获取最后修改时间 
last_write_time(const Path& p, const std::time_t new_time);// 修改最后修改时间 

remove(const Path& p, system::error_code & ec = singular );//  删除文件 
remove_all(const Path& p);//   递归删除p中所有内容,返回删除文件的数量 
rename(const Path1& from_p, const Path2& to_p);//  重命名 
copy_file(const Path1& from_fp, const Path2& to_fp);//  拷贝文件 
创建目录 create_directories()
1
2
3
if(!boost::filesystem::exists(str_path)) {
    boost::filesystem::create_directories(str_path);
}
重命名 rename()
  • rename(const path& frompath, const path& topath)
查看文件大小 file_size()
  • boost::filesystem::file_size() 以字节数返回文件大小
1
2
3
4
5
6
7
8
9
10
11
12
#include <boost/filesystem.hpp> 
#include <iostream> 

int main() { 
  boost::filesystem::path p("C:\\Windows\\win.ini"); 
  try { 
    std::cout << boost::filesystem::file_size(p) << std::endl; 
  } 
  catch (boost::filesystem::filesystem_error &e) { 
    std::cerr << e.what() << std::endl; 
  } 
}
获取磁盘的总空间和剩余空间 space()
  • boost::filesystem::space() 用于取回磁盘的总空间和剩余空间
  • 它返回一个 boost::filesystem::space_info 类型的对象,
  • 其中定义了三个公有属性:capacity, free 和 available。
  • 这三个属性的类型均为 boost::uintmax_t,该类型定义于 Boost.Integer 库,通常是 unsigned long long 的 typedef
  • 磁盘空间是以字节数来计算的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <boost/filesystem.hpp> 
#include <iostream> 

int main() { 
  boost::filesystem::path p("C:\\"); 
  try  { 
    boost::filesystem::space_info s = boost::filesystem::space(p); 
    std::cout << s.capacity << std::endl; 
    std::cout << s.free << std::endl; 
    std::cout << s.available << std::endl; 
  } 
  catch (boost::filesystem::filesystem_error &e) { 
    std::cerr << e.what() << std::endl; 
  } 
} 

文件流

C++ 标准在 fstream 头文件中定义了几个文件流。这些流不能接受 boost::filesystem::path 类型的参数。为了当前可以让文件流与类型为 boost::filesystem::path 的路径信息一起工作,可以使用头文件 boost/filesystem/fstream.hpp

1
2
3
4
5
6
7
8
#include <boost/filesystem/fstream.hpp> 
#include <iostream> 

int main(){ 
  boost::filesystem::path p("test.txt"); 
  boost::filesystem::ofstream ofs(p); 
  ofs << "Hello, world!" << std::endl; 
} 

其他

错误获取
  • boost::filesystem::filesystem_error
  • 进行一些操作的时候,可以使用filesystem_error获取错误
1
2
3
4
5
6
7
boost::filesystem::path p("/home/william/"); 
try { 
    std::cout << boost::filesystem::file_size(p) << std::endl; 
} 
catch (boost::filesystem::filesystem_error &e) { 
	std::cerr << e.what() << std::endl; 
} 

Contact

Feel free to contact me windmillyucong@163.com anytime for anything.

License

Creative Commons BY-SA 4.0