C++/STL

[C++17] std::filesystem::path

sseram 2023. 4. 4. 20:12
반응형

 

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