C++ std::filesystem API 활용
기본 경로 조작
섹션 제목: “기본 경로 조작”#include <filesystem>namespace fs = std::filesystem;
fs::path p = "/home/user/docs/report.txt";
std::cout << p.root_path(); // /std::cout << p.parent_path(); // /home/user/docsstd::cout << p.filename(); // report.txtstd::cout << p.stem(); // reportstd::cout << p.extension(); // .txt
// 경로 합성fs::path dir = "/home/user";fs::path file = dir / "docs" / "report.txt"; // operator/ 로 합성파일 존재 확인 및 타입
섹션 제목: “파일 존재 확인 및 타입”fs::path p = "data.txt";
if (fs::exists(p)) { if (fs::is_regular_file(p)) std::cout << "파일\n"; if (fs::is_directory(p)) std::cout << "디렉터리\n"; if (fs::is_symlink(p)) std::cout << "심볼릭 링크\n";
std::cout << "크기: " << fs::file_size(p) << " bytes\n"; auto ftime = fs::last_write_time(p);}디렉터리 탐색
섹션 제목: “디렉터리 탐색”// 단순 탐색 (비재귀)for (const auto& entry : fs::directory_iterator("./src")) { std::cout << entry.path() << '\n';}
// 재귀 탐색for (const auto& entry : fs::recursive_directory_iterator("./src")) { if (entry.is_regular_file() && entry.path().extension() == ".cpp") std::cout << entry.path() << '\n';}파일·디렉터리 생성, 복사, 삭제
섹션 제목: “파일·디렉터리 생성, 복사, 삭제”// 디렉터리 생성fs::create_directory("output");fs::create_directories("a/b/c"); // 중간 경로 자동 생성
// 복사fs::copy("src.txt", "dst.txt");fs::copy("src_dir", "dst_dir", fs::copy_options::recursive);
// 이동/이름 변경fs::rename("old.txt", "new.txt");
// 삭제fs::remove("file.txt");fs::remove_all("dir"); // 디렉터리와 내용 전체 삭제
// 심볼릭 링크fs::create_symlink("target.txt", "link.txt");오류 처리
섹션 제목: “오류 처리”// 예외 방식try { fs::copy("a.txt", "b.txt");} catch (const fs::filesystem_error& e) { std::cerr << e.what() << '\n'; std::cerr << "path1: " << e.path1() << '\n';}
// 에러 코드 방식 (예외 없음)std::error_code ec;fs::copy("a.txt", "b.txt", ec);if (ec) { std::cerr << ec.message() << '\n';}임시 디렉터리와 절대 경로
섹션 제목: “임시 디렉터리와 절대 경로”fs::path tmp = fs::temp_directory_path(); // /tmp (Linux), C:\Temp (Windows)fs::path abs = fs::absolute("relative/path");fs::path can = fs::canonical("/path/../to/./file"); // 심볼릭 링크 해석 + 정규화디렉터리 크기 계산
섹션 제목: “디렉터리 크기 계산”uintmax_t dirSize(const fs::path& dir) { uintmax_t total = 0; for (const auto& entry : fs::recursive_directory_iterator(dir, fs::directory_options::skip_permission_denied)) { if (entry.is_regular_file()) total += entry.file_size(); } return total;}권한 관리
섹션 제목: “권한 관리”fs::permissions("script.sh", fs::perms::owner_exec | fs::perms::group_exec, fs::perm_options::add);
auto perms = fs::status("file.txt").permissions();if ((perms & fs::perms::owner_read) != fs::perms::none) std::cout << "읽기 가능\n";fs::path로 크로스플랫폼 경로 조작directory_iterator/recursive_directory_iterator로 탐색- 예외 방식 또는
std::error_code방식으로 오류 처리 선택 copy_options::recursive로 디렉터리 전체 복사skip_permission_denied로 권한 없는 항목 건너뜀