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