文件系统
Posted zhangrelay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件系统相关的知识,希望对你有一定的参考价值。
原书作者给出了如下介绍:
主要参考如下:
☞ www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/index.htm
介绍
Boost.Filesystem 库提供了可移植的工具来查询和操作路径、文件和目录。
该库的动机是需要在 C++ 程序中执行可移植的类似脚本的操作。其目的不是与 Python、Perl 或 shell 语言竞争,而是在 C++ 已经是首选语言时提供可移植的文件系统操作。该设计鼓励但不要求安全和便携的使用。
使用该库的程序是可移植的,无论是在程序代码的语法是可移植的意义上,还是在代码的语义或行为是可移植的意义上。通用路径语法是对可移植性的另一个重要帮助。
使用是安全的,因为大多数函数在检测到错误时都会抛出 C++ 异常,因此不能忽略错误。这对用户来说也很方便,因为它减少了显式检查错误返回代码的需要。
C++ 标准委员会接受了在技术报告 2 中包含 Boost.Filesystem 的提案 N1975。 Boost.Filesystem 库将与 TR2 文件系统提案保持一致,因为它通过 TR2 流程工作。但是请注意,Boost.Filesystem 和 TR2 提案之间的命名空间和标头粒度不同。
Boost.Filesystem 库提供了几个头文件:
头文件 <boost/filesystem.hpp> 提供类 basic_path,这是一种在 C++ 程序中表示路径的可移植机制。 typedefs path 和 wpath 简化了 basic_path 最常见的用法。操作函数提供对文件和目录有用的查询和维护操作。具有 typdefs directory_iterator 和 wdirectory_iterator 的类 basic_directory_iterator 提供对目录内容的迭代。便利函数和类以有用的方式结合了低级功能。
头文件 <boost/filesystem/fstream.hpp> 提供与 C++ 标准库的 fstream 头文件相同的组件,除了文件由 basic_path 对象而不是 char * 标识。
☞ en.cppreference.com/w/cpp/filesystem
文件系统库
C++ 文件系统库
Filesystem 库提供了对文件系统及其组件(例如路径、常规文件和目录)执行操作的工具。
文件系统库最初开发为 boost.filesystem,作为技术规范 ISO/IEC TS 18822:2015 发布,最终从 C++17 合并到 ISO C++。 boost 实现目前在比 C++17 库更多的编译器和平台上可用。
如果实现无法访问分层文件系统,或者如果它不提供必要的功能,则文件系统库设施可能不可用。如果底层文件系统不支持某些功能(例如 FAT 文件系统缺少符号链接并禁止多个硬链接),则它们可能不可用。在这些情况下,必须报告错误。
如果对该库中函数的调用引入了文件系统竞争,即当多个线程、进程或计算机交叉访问和修改文件系统中的同一对象时,则行为未定义。
库范围的定义
文件:保存数据的文件系统对象,可以写入、读取或两者兼而有之。文件具有名称、属性,其中之一是文件类型:
目录:充当目录条目容器的文件,用于标识其他文件(其中一些可能是其他嵌套目录)。在讨论特定文件时,它作为条目出现的目录是它的父目录。父目录可以用相对路径名“..”表示。
常规文件:将名称与现有文件(即硬链接)相关联的目录条目。如果支持多个硬链接,则在删除最后一个硬链接后删除文件。
符号链接:将名称与路径相关联的目录条目,该路径可能存在也可能不存在。
其他特殊文件类型:块、字符、fifo、套接字。
文件名:命名文件的字符串。允许的字符、区分大小写、最大长度和不允许的名称是实现定义的。名称“。” (点)和“..”(点-点)在库级别具有特殊含义。
路径:标识文件的元素序列。它以一个可选的根名称开头(例如 Windows 上的“C:”或“//server”),后跟一个可选的根目录(例如 Unix 上的“/”),然后是零个或多个文件名的序列(除了最后一个必须是目录或目录链接)。本机格式(例如,哪些字符用作分隔符)和路径的字符串表示(路径名)的字符编码是实现定义的,该库提供路径的可移植表示。
绝对路径:明确标识文件位置的路径。
规范路径:不包含符号链接的绝对路径,“.”或“..”元素。
相对路径:标识文件相对于文件系统上某个位置的位置的路径。特殊路径名“.” (dot, "current directory") 和 ".." (dot-dot, "parent directory") 是相对路径。
获取文件大小代码:
#include <boost/filesystem/operations.hpp>
#include <iostream>
namespace fs = boost::filesystem;
int main( int argc, char* argv[] )
if ( argc != 2 )
std::cout << "Usage: file_size path\\n";
return 1;
std::cout << "sizeof(intmax_t) is " << sizeof(boost::intmax_t) << '\\n';
fs::path p( argv[1], fs::native );
if ( !fs::exists( p ) )
std::cout << "not found: " << argv[1] << std::endl;
return 1;
if ( !fs::is_regular( p ) )
std::cout << "not a regular file: " << argv[1] << std::endl;
return 1;
std::cout << "size of " << argv[1] << " is " << fs::file_size( p )
<< std::endl;
return 0;
#include <iostream>
#include <fstream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
fs::path p = fs::current_path() / "example.bin";
std::ofstream(p).put('a'); // create file of size 1
std::cout << "File size = " << fs::file_size(p) << '\\n';
fs::remove(p);
try
fs::file_size("/dev"); // attempt to get size of a directory
catch(fs::filesystem_error& e)
std::cout << e.what() << '\\n';
对比一下看看差异即可。
以上是关于文件系统的主要内容,如果未能解决你的问题,请参考以下文章