반응형
c++17 부터 추가된 filesystem 안에 있는 path.
https://en.cppreference.com/w/cpp/filesystem/path
자세한 것들은 여기있고..
기본적으로 사용하는 것들 따로 정리해 보았다.
먼저, std::filesystem:: ~~ 라고 쓰기 귀찮으니, 관례적으로 using fs = std::filesystem이라 정의해 두고 사용한다고 한다.
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main() {
// 현재 파일
fs::path _path("./test.txt");
std::cout << fs::is_regular_file(_path) << std::endl;
std::cout << fs::is_directory(_path) << std::endl;
std::cout << fs::is_empty(_path) << std::endl;
std::cout << fs::exists(_path) << std::endl;
return 0;
}
일단 기본적인 함수들.
해당 상대 경로에 test.txt를 만들어 둬서, 출력은 1, 0, 0, 1 이 나온다.
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main() {
// 현재 파일
fs::path _path("./test.txt");
fs::path _path_2(R"(../../..\repos\cppTest\testproj\test.txt)");
std::cout << _path.relative_path() << std::endl;
std::cout << _path.extension() << std::endl;
std::cout << _path.filename() << std::endl;
std::cout << _path.root_name() << std::endl;
std::cout << std::endl << std::endl;
std::cout << _path_2.relative_path() << std::endl;
std::cout << _path_2.extension() << std::endl;
std::cout << _path_2.filename() << std::endl;
std::cout << _path_2.root_name() << std::endl;
return 0;
}
path class의 맴버 함수들.
마지막은 C:, D: . 이런 식으로 root driver가 나온다. 상대 경로로 지정하면 나오지 않는 모양.
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main() {
// 현재 파일
fs::path _path("./test.txt");
if (_path.has_extension()) {
_path.replace_extension();
std::cout << _path.relative_path() << std::endl;
_path.replace_extension(".bin");
std::cout << _path.relative_path() << std::endl;
}
return 0;
}
이런 식으로 확장자를 변경할 수 있다.
물론 replace_filename 맴버 함수로 filename 도 변경 가능하다.
그리고
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main() {
// 현재 파일
fs::path _path(R"(..\..\..\repos\cppTest\testproj\)");
std::cout << _path << std::endl;
_path /= R"(..\)";
std::cout << _path << std::endl;
_path += R"(testproj\)";
std::cout << _path << std::endl;
return 0;
}
이런 식으로, 직관적으로 path를 사용할 수 있도록 만들어 놓은 건 좀 신기하더라.
/=, += 등의 operator를 들어가 보면 내부적으로 this->append를 호출하도록 되어 있더라.
항상 고생하면서 path 추가 했던 것 같은데...
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main() {
// 현재 파일
fs::path _path(R"(..\..\..\repos\cppTest\testproj\)");
std::cout << _path << std::endl;
_path /= R"(..\)";
_path += R"(testproj1\)";
_path /= R"(..\)";
_path += R"(testproj2\)";
_path /= R"(..\)";
_path += R"(testproj3\)";
std::cout << _path << std::endl;
std::cout << _path.lexically_normal() << std::endl;
return 0;
}
또, lexically~~ 를 통하여 상대 경로로 되어 있는 걸 깔끔하게 표현할 수도 있다.
반응형
'C++ > STL' 카테고리의 다른 글
[C++] std::async, std::thread (2) (0) | 2023.04.10 |
---|---|
[C++] std::async, std::thread (1) (0) | 2023.04.09 |
[C++17 ] FOLD Expression (0) | 2023.03.29 |
[C++ String] raw String (0) | 2023.02.27 |
[C++ Container] map/unordered_map. at, []. element access 차이 (0) | 2023.02.24 |