boost库对文件及文件夹的操作

Boost Filesystem库提供了关于文件及文件夹的相关操作。Boost Filesystem库具有标准的C++接口,可移指,具有错误异常处理的功能.

包含boost文件系统头文件之前建议加上如下定义,放置无意中使用旧的特性:

        #define BOOST_FILESYSTEM_NO_DEPRECATED

1. 头文件包含

常用到的有两个头文件:

  1. <boost/filesystem.hpp>提供对除文件流外的所有文件库的访问;
  2. <boost/filesystem/fstream.hpp>与C++标准库的fstream头文件相同,不同在于文件是由const path&识别,而不是const char*识别。

Boost Filesystem库提供了boost::filesystem::path类,对路径进行处理,比如,创建目录或验证某个给定文件的有效性等。

2. boost::filesystem::path类

boost::filesystem::path类表示路径的信息,并提供了处理路径的方法。
boost::filesystem::path是boost::filesystem::basic_path<std::string>的一个typedef;
boost::filesystem::wpath是boost::filesystem::basic_path<std::wstring>的一个typedef。

boost::filesystem::path类可以传入一个字符串来构建一个路径。构造函数不会验证传入的字符串是否是文件或目录,甚至可以传没有意义的字符串。

	boost::filesystem::path p1("C:\\Test");  // 传入正常的路径
	boost::filesystem::path p2("#..");  // 传入无意义的路径

Boost Filesystem内部使用斜杠 / 作为文件名与目录名的分隔符。

boost::filesystem::path提供一些方法访问路径中的特定组件。

boost::filesystem::path还提供一些方法检查一个路径中是否包含某个特定字串。

boost::filesystem::path还提供了方法拆分一个文件名为各个组件,仅当has_filename()为true时使用,否则会返回空字符串。

修改路径使用重载的operator/=()操作符,会把=右边的路径添加到原来路径之上;还可以使用remove_filename()移除文件名。

具体参考如下代码:

		boost::filesystem::path p1("F:\\Test\\");  // 传入正常的路径
		boost::filesystem::path p2("#125");  // 传入无意义的路径
		boost::filesystem::path p3("D:\\IDE\\boost\\boost_1_46\\include\\boost-1_46\\boost\\filesystem\\exception.hpp");

		std::cout << p1.string() << std::endl;
		std::cout << p2.string() << std::endl;
		std::cout << p3.string() << std::endl;

		std::cout << "p1.root_name():\t" << p1.root_name() << std::endl;  // 返回根目录的名字,例 C
		std::cout << "p1.root_directory():\t" << p1.root_directory() << std::endl;  // 返回/
		std::cout << "p1.root_path():\t" << p1.root_path() << std::endl;  // 返回根目录的名字+/,例 C:/
		std::cout << "p1.relative_path():\t" << p1.relative_path() << std::endl;  // 返回除root_path()之外的其它所有字符,例 Test
		std::cout << "p1.parent_path():\t" << p1.parent_path() << std::endl;  // 返回除filename()之外的所有字符,不包含/,例 C:/Test
		std::cout << "p1.filename():\t" << p1.filename() << std::endl;  // 返回目录或文件的名字
		std::cout << "p1.has_root_name():\t" << p1.has_root_name() << std::endl;  // 是否有根目录
		std::cout << "p1.has_root_path():\t" << p1.has_root_path() << std::endl;  //是否有根路径
		std::cout << "p1.has_root_directory():\t" << p1.has_root_directory() << std::endl;  // 是否有根路径
		std::cout << "p1.has_relative_path():\t" << p1.has_relative_path() << std::endl;  // 绝对路径
		std::cout << "p1.has_parent_path():\t" << p1.has_parent_path() << std::endl;  // 父目录
		std::cout << "p1.has_filename():\t" << p1.has_filename() << std::endl;  // 文件名
		std::cout << "p1.stem():\t" << p1.stem() << std::endl;  // 文件名,不加后缀
		std::cout << "p1.extension():\t" << p1.extension() << std::endl;  // 后缀名

		// 对路径的各个组件进行迭代
		for(boost::filesystem::path::iterator it = p1.begin(); it != p1.end(); ++it){
			std::cout << *it << std::endl;  // 分别输出 F:  /  Test  .
		}

		p1 /= "boot.ini";
		std::cout << "new p1:\t" << p1.string() << std::endl;
		boost::filesystem::path p1_old = p1.remove_filename();
		std::cout << "new p1:\t" << p1.string() << std::endl;
		std::cout << "old p1:\t" << p1_old.string() << std::endl;
		std::cout << std::endl;
		p1_old = p1.replace_extension(boost::filesystem::path("\\boot.ini"));
		std::cout << "new p1:\t" << p1.string() << std::endl;
		std::cout << "old p1:\t" << p1_old.string() << std::endl;

3. 针对错误的处理

boost::filesystem::path的函数失败的时候,会抛出一个类型为boost::filesystem::filesystem_error的异常类,这个类派生自boost::system::system_error

boost::filesystem::filesystem_error继承了父类的what()code()方法,另外还有两个方法path1()path2(),都返回boost::filesystem::path对象。

多数函数在失败时,会抛出两个异常,一个是boost::filesystem::filesystem_error,另一个是boost::system::error_code,对于后者,需要对返回值进行明确的检查以去欸的那个是否出错。

4. 查询一个文件或目录的状态

boost::filesystem::status返回一个boost::filesystem::file_status类型的对象,该对象可以被传递给其它辅助函数。

  • 如果查询一个目录的状态,可以使用boost::filesystem::is_directory()
  • 查询是不是普通文件,可以使用boost::filesystem::is_regular_file()
  • 查询是不是链接,使用boost::filesystem::is_symlink()
  • 查询文件是否存在,可以使用boost::filesystem::exists()
  • 查询一个符号链接的状态,可以使用boost::filesystem:symlink_status()
  • 查询一个文件的大小,可以使用boost::filesystem::file_size()
  • 查询一个文件最后被修改的时间,可以使用boost::filesystem::last_write_time()
  • 查询磁盘的总空间和剩余空间,可以使用boost::filesystem::space(),该函数返回boost::filesystem_space_info对象,有三个公有属性:capacityfreeavailable。这三个属性类型为boost::uintmax_t,以字节为单位。
  • 查询当前工作目录,可以使用boost::filesystem::current_path(),该函数只能在windows中执行;

参考如下代码:

		boost::filesystem::path ps("1.txt");
		boost::filesystem::file_status s = boost::filesystem::status(ps);
		std::cout << "ps is directory?\t" << boost::filesystem::is_directory(s) << std::endl;
		std::cout << "ps is exists?\t" << boost::filesystem::exists(s) << std::endl;
		std::cout << "ps is regular_file?\t" << boost::filesystem::is_regular_file(s) << std::endl;
		std::cout << "ps is symlink?\t" << boost::filesystem::is_symlink(s) << std::endl;
		std::cout << "file size:\t" << boost::filesystem::file_size(ps) << std::endl;
		std::time_t t =boost::filesystem::last_write_time(ps);
		std::cout << "file last write time:\t" << std::ctime(&t) << std::endl;

		boost::filesystem::path pspace("C:\\");
		boost::filesystem::space_info spaceinfo = boost::filesystem::space(pspace);
		std::cout << spaceinfo.capacity << std::endl;
		std::cout << spaceinfo.available << std::endl;
		std::cout << spaceinfo.free << std::endl;

5. 创建、删除、复制、更改文件或目录

  • 创建目录,可以使用boost::filesystem::create_directory()
  • 创建多级目录,可以使用boost::filesystem::create_directories()
  • 更改文件名或目录名,可以使用rename()
  • 删除文件或目录,可以使用boost::filesystem::remove(),删除目录时需要确保该目录下是空的,没有子文件夹或文件;
  • 复制文件,可以使用copy_file(),使用时需要注意如果复制到的目录下已经存在该文件,或者复制到的目录不存在,该函数都会失败;
  • 复制目录,可以使用copy_directory(),使用时需要注意如果目录已经存在,该函数会失败;
		boost::filesystem::path pc("E:\\Test\\test");
		std::cout << "pc = " << pc.string() << std::endl;
		if(!boost::filesystem::exists(pc) && boost::filesystem::create_directories(pc))
		{
			boost::filesystem::rename(pc,"E:\\Test\\test3");
			std::cout << "rename_pc = " << pc.string() << std::endl;
		}
		boost::filesystem::remove("E:\\Test\\test3");

		boost::filesystem::path pr("1.txt");
		boost::filesystem::rename(pr,"2.txt");
		boost::filesystem::remove("2.txt");

		boost::filesystem::copy_directory("E:\\VSCode","D:\\VSCode");
		boost::filesystem::copy_file("E:\\VSCode\\1.txt","D:\\VSCode\\1.txt");

6. 练习

创建一个程序,该程序为位于应用程序当前工作目录的上一层目录中的一个名为 data.txt 的文件创建一个绝对路径。 例如,如果该程序从 C:\Program Files\Test 执行,则应显示 C:\Program Files\data.txt

void practice1()
{
	try
	{
		boost::filesystem::path currentPath = boost::filesystem::current_path();
		std::cout << "current path = " << currentPath.string() << std::endl;
		
		boost::filesystem::path parentPath = currentPath.parent_path();
		std::cout << "parent path = " << parentPath.string() << std::endl;

		parentPath /= "data.txt";
		std::cout << "new path = " << parentPath.string() << std::endl;

	}
	catch(boost::filesystem::filesystem_error &err)
	{
		std::cout << "error what:\t" << err.what() << std::endl;
		std::cout << "error code:\t" << err.code() << std::endl;
		std::cout << "error path1:\t" << err.path1() << std::endl;
		std::cout << "error path2:\t" << err.path2() << std::endl;
	}
	catch(...)
	{
		std::cout << "exception exists!" << std::endl;
	}

}

文章参考:Highscore - Boost C++ 库 - 文件系统

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值