天天看點

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");
           

繼續閱讀