天天看点

boost::filesystem常用功能

boost库文档

system_complete(path); 返回完整路径(相对路径 + 当前路径)

exists(path); 目录是否存在

is_directory(path);

is_directory(file_status); 是否是路径

is_empty(path); 文件夹是否为空,必须保证路径存在,否则抛异常

is_regular_file(path);

is_regular_file(file_status); 是否是普通文件

is_symlink(path);

is_symlink(file_status); 是否是一个链接文件

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

initial_path(); 得到程序运行时的系统当前路径

current_path(); 得到系统当前路径

current_path(const Path& p); 改变当前路径

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); 修改最后修改时间

bool create_directory(const Path& dp); 建立路径

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); 建立软链接

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); 拷贝文件

omplete(const Path& p, const Path& base = initial_path<Path>()); 以base以基,p作为相对路径,返回其完整路径

create_directories(const Path & p); 建立路径

1. 需要头文件如下:

#include <boost\filesystem.hpp>// vs2015也自带filesystem,但只包含部分功能,它在std::experimental::filesystem下,需要头文件<filesystem>
           

2. 输出目录下文件名和文件夹名,为了简化using namespace boost;

filesystem::path dirpath = "I:\\迅雷下载";
	filesystem::directory_iterator end;// 只支持本层目录遍历
	for (filesystem::directory_iterator iter(dirpath); iter != end; iter++)
	{
		filesystem::path p = *iter;
		//std::cout << p.leaf() << std::endl;// 叶子结点文件名
		//std::cout << p.stem() << std::endl;// 叶子结点文件名(无后缀)
		//std::cout << p.string() << std::endl;// 文件名(不带引号)
		std::cout << p.leaf().string() << std::endl;// 叶子结点文件名std::string型
	}
           

3. 用递归函数深度优先遍历文件夹

// 对文件夹深度优先遍历获取所有文件名放入容器中
void getAllFileNames(const std::string & pathName, std::vector<std::string> & vecOut)
{
	using namespace boost::filesystem;
	path rootPath(pathName);
	for (directory_iterator iter(rootPath); iter != directory_iterator(); iter++)
	{
		if (is_directory(*iter))
		{
			getAllFileNames(path(*iter).string(), vecOut);
		}
		else
		{
			vecOut.emplace_back(path(*iter).string());
		}
	}
}
           
// 调用递归函数深度优先遍历文件夹
	std::vector<std::string> files;
	getAllFileNames("I:\\迅雷下载", files);
	for (auto name : files)
	{
		std::cout << name << std::endl;
	}
           

4. 用递归迭代器遍历

filesystem::path dirpath2("I:\\迅雷下载");
	for (filesystem::recursive_directory_iterator iter(dirpath2); iter != filesystem::recursive_directory_iterator(); iter++)
	{
		if (filesystem::is_directory(*iter) && iter.level() > 0)// 只在路径的基础上再打开一层文件夹,此时level = 1,遇到文件夹设置no_push()不再深入
		{
			iter.no_push();
		}
		else if (!filesystem::is_directory(*iter))
		{
			std::cout << *iter << std::endl;
		}// 同理还有pop()方法跳出该目录
	}
           

5. 删除文件或空文件夹

if (filesystem::remove("I:\\empty"))// 可以删除空文件夹,文件或文件夹不存在返回false,如果文件夹里有文件或文件夹抛异常
		std::cout << "deleted" << std::endl;
           

6.删除文件夹及其下全部文件

filesystem::path dirpath3("I:\\garbage");
	if (filesystem::exists(dirpath3))
	{
		uintmax_t totalNum = filesystem::remove_all("I:\\garbage");// 返回删除的文件夹和文件数,包括路径本身
		std::cout << "删除" << totalNum << "个文件或文件夹" << std::endl;
	}
	else
	{
		std::cout << "路径不存在" << std::endl;
	}
           

7.  修改当前目录位置(起初位置是在main.cpp文件夹,用这种方式可以改变)

filesystem::current_path("I:\\新建文件夹");
	std::cout << filesystem::initial_path();
           

8. 文件转移(本质就是重命名路径)

void moveFileToDir(const std::string & file, const std::string & dir)
{
	using namespace boost::filesystem;
	path oldFilePath(file);
	create_directories(dir);
	path newFilePath(dir + "\\" + oldFilePath.leaf().string());
	rename(oldFilePath, newFilePath);
}
           
// 调用文件转移函数
	if (filesystem::exists("I:\\迅雷下载\\Thunder9.1.25.604.exe"))
		moveFileToDir("I:\\迅雷下载\\Thunder9.1.25.604.exe", "I:\\temp");
           

继续阅读