boost라이브러리의 filesystem사용 1강
1강. filesystem 라이브러리의 기본 클래스 boost::filesystem::path
2강. iteration (이터레이션)
3강. boost::filesystem 의 유용한 경로/파일 조작 함수들
심심하던 차에 이리저리 서핑을 하다 우연히 boost사이트에 들어가서
시간을 죽이고 있었습니다. (시간을 죽인다는 뜻은 생각없이 멍하니 보고
있었다는 뜻. :))
메일링 리스트를 확인하던중
파일 경로(패스) 를 조작하는 라이브러리가 있다는 것을 발견하고
아하! 하는 생각에 바로 조사에 들어갔습니다.
요새 안그래도 화일경로 같은거 조작할때 짜증나는 부분이
한두가지가 아니였는데.. 역시 boost는 저를 실망 시키지 않았습니다.
이번 강의는 세개의 강의로 나누어 진행하도록 하겠습니다.
일단 저도 사용한지 몇번 안되는 관계로 디테일한 내용보다는
어떻게 사용하는지 간단히 알아보는 정도밖에 안되겠네요.^^
자 그럼 시작 합니다.
일단 http://www.boost.org/libs/filesystem/doc/index.htm 이곳에서
라이브러리를 얻을수 있습니다.
인스톨을 하면 몇가지 LIB화일과 DLL화일들이 생깁니다.
설치 과정은 생략하고 간단한 사용법을 정리해 보겠습니다.
일단 모든 화일경로를 대표하는 기본 클래스는 boost::filesystem::path 입니다.
(편의를 위해 네임스페이스는 생략하고 path라고 칭하겠습니다. 또한 boost::filesystem의
네임스페이스는 fs로 줄여얘기하겠습니다.)
일단 경로를 생성하는 방법부터 알아보겠습니다.
path my_path( "c:/windows/system32" ); // 1번
path my_path( "c:/windows/system32/readme.txt" ); // 2번
path my_path( "c:\windows\system32\readme.txt", fs::native ); // 3번
path my_path( fs::initial_path() ); // 4번
대략 이정도로 추려 볼수 있겠습니다.
먼저 1번의 경우는 일반 char* 형태의 문자열을 받아 그 경로를 생성합니다.
2번의 경우는 1번의 경우와 구조는 같은데 단지 파일경로를 나타낸다는데 차이가 있습니다.
3번은 약간 다른 구조를 같는데요, 일단 fs::path 클래스는 기본적으로 유닉스(리눅스) 경로는
기본으로 사용하고 있는듯 합니다.(자세한 사항은 직접 boost.org 를 통해 확인해 주세요^^)
따라서 만약 my_path( "c:\windows" ) 이런식의 생성은 예외를 발생합니다.
따라서 윈도우즈 환경에서 경로를 생성하려면 두번째 인자에 fs::native 라는 옵션을 주어야
아하! 너는 윈도우 환경이고 윈도우용 경로를 만들려고 하는구나 하고
지가 알아서 생성해 줄겁니다.
4번의 경우는 fs 라이브러리의 함수를 사용하는 겁니다.
위 함수는 현재 디렉토리를 리턴해 줍니다. 따라서 현재 이 프로그램의 경로를 나타냅니다.
일단 위의 path객체를 생성하셨다면 다양한 멤버 함수를 이용하실수 있습니다.
일단 기본적으로 가장 많이 사용하게될 멤버함수는 string() 입니다.
이 함수는 std::string 객체를 리턴합니다.
따라서 위에서 생성한(1번을 기준으로) 객체에서
std::string strPath = my_path.string();
위의 호출은 "c:/windows/system"이라는 경로를 리턴합니다. 경로 구분자가 가 아니라 / 이라는데 주의 하세요
위에서도 간단히 살펴보았듯 운영체제에 따라 다른경로가 사용됩니다.
운영체제에 따라 적절한 구분자를 사용하는 문자열을 리턴하는 함수는
native_directory_string()
가 되겠습니다.
따라서 my_path.native_directory_string() 위 호출은 c:windowssystem 을 갖는 string 객체를 리턴합니다.
사용이 간단하죠?
자. fs::path 클래스의 꽃이라고 볼수있는 / 연산자 재정의 부분을 살펴보겠습니다.
특히 이부분에서 역시 boost 라이브러리구나 하는것을 다시 느끼게 되었습니다.
만약 기존의 방식으로 파일의 경로를 추가 할때는 적어도 2~3줄의 코드를 사용하셨을 겁니다.
무슨 얘기 인고 하니, 예를 들어 보겠습니다.
만약 어떤 문자열이 "c:windows" 을 갖고 있다고 가정합시다.
거기다 "system32"라는 서브 디렉토리를 갖다가 붙인다고 가정해 볼게요.
그럼 대략적인 코드는 이렇습니다.
char * szPath = "c:\windows";
strcat(szPath , "\system32" );
사실 뭐 그리 복잡하지는 않네요.. 하지만 좀 뭐가 더티한 느낌이 남아 있죠?
만약 c:windows 가 아니라 c:window 으로 마지막에 이 하나 더 붙어 있으면
또 루틴을 달리에서 그냥 system32 라는 문자열만 붙이는등 아무튼 짜증 스럽네요^^;;
자 이제 fs::path에서는 어떻게 하는지 봅시다.
fs::path my_path("c:/windows");
my_path = my_path / "system32";
이 얼마나 간단 합니까...
/ 연산자의 재정의 아주 훌륭한 아이디어 입니다. 그쵸?
따라서 위의 my_path 는 c:/windows/system32를 갖게 됩니다.
ㅋㅋ 대단 대단~~
/ 연산자 말고도 /= 연산자도 있는데 그 의미는 같습니다.
fs::path my_path("c:/windows");
my_path /= "system32";
위의 코드와 똑같이 같습니다.
그럼 일단 이 정도가 가장 기본적인 내용들이고요..
한 두어가지 함수만 더 설명하고 첫강의를 마무리 하도록 하겠습니다.
그다음 살펴볼 함수가 leaf() 입니다.
이 함수는 가장 마지막 디렉토리나 화일명을 리턴합니다.
c:/windows/system32 의 leaf 는 system32 입니다.
c:/aaa/dddd/memo.txt 의 leaf 는 memo.txt 입니다.
보시는 바와 같이 기존에는 / 나 를 기준으로 tokenizing 하는 것들을 (사실 짜증나고 버그가
생길 가능성이 많겠죠?)
한가지 함수로 해결합니다.
마지막으로 볼 함수는 branch_path() 입니다. 이 함수는
부모 디렉토리의 fs::path 객체를 리턴합니다.
즉 c:/windows/aaa/ddd 의 부모경로는 c:/windows/aaa 가 되겠죠?
string을 리턴하는 것이 아닌 fs::path 객체를 리턴하는것 잊지 마세요~
그럼 일단 이정도에서 마무리 하겠습니다.
http://www.boost.org/libs/filesystem/doc/path.htm#synopsis
위의 경로에서 fs::path 클래스의 원형을 보실수 있고요.
함수는 몇가지 안되서 이것저것 써보시는 금방 다 아실수 있으실겁니다.
ㅋㅋ. 사실 강좌할 거리도 아닌데 강좌랍시고 했네요.
그냥 이런 좋은 클래스를 모든 여러분께 알려 드리고 싶었습니다.
그럼 filesystem 라이브러리를 이용해
조금이라도 편한 개발 하시길 바라면서 2부 강좌에서 다시 뵙도록 하겠습니다.
***************************************************
백택 (bektek@gmail.com)
홈페이지 : http://bektekk.wo.to
본 강좌는 위의 홈페이지 에서도 보실수 있습니다.
***************************************************
1강. filesystem 라이브러리의 기본 클래스 boost::filesystem::path
2강. iteration (이터레이션)
3강. boost::filesystem 의 유용한 경로/파일 조작 함수들
심심하던 차에 이리저리 서핑을 하다 우연히 boost사이트에 들어가서
시간을 죽이고 있었습니다. (시간을 죽인다는 뜻은 생각없이 멍하니 보고
있었다는 뜻. :))
메일링 리스트를 확인하던중
파일 경로(패스) 를 조작하는 라이브러리가 있다는 것을 발견하고
아하! 하는 생각에 바로 조사에 들어갔습니다.
요새 안그래도 화일경로 같은거 조작할때 짜증나는 부분이
한두가지가 아니였는데.. 역시 boost는 저를 실망 시키지 않았습니다.
이번 강의는 세개의 강의로 나누어 진행하도록 하겠습니다.
일단 저도 사용한지 몇번 안되는 관계로 디테일한 내용보다는
어떻게 사용하는지 간단히 알아보는 정도밖에 안되겠네요.^^
자 그럼 시작 합니다.
일단 http://www.boost.org/libs/filesystem/doc/index.htm 이곳에서
라이브러리를 얻을수 있습니다.
인스톨을 하면 몇가지 LIB화일과 DLL화일들이 생깁니다.
설치 과정은 생략하고 간단한 사용법을 정리해 보겠습니다.
일단 모든 화일경로를 대표하는 기본 클래스는 boost::filesystem::path 입니다.
(편의를 위해 네임스페이스는 생략하고 path라고 칭하겠습니다. 또한 boost::filesystem의
네임스페이스는 fs로 줄여얘기하겠습니다.)
일단 경로를 생성하는 방법부터 알아보겠습니다.
path my_path( "c:/windows/system32" ); // 1번
path my_path( "c:/windows/system32/readme.txt" ); // 2번
path my_path( "c:\windows\system32\readme.txt", fs::native ); // 3번
path my_path( fs::initial_path() ); // 4번
대략 이정도로 추려 볼수 있겠습니다.
먼저 1번의 경우는 일반 char* 형태의 문자열을 받아 그 경로를 생성합니다.
2번의 경우는 1번의 경우와 구조는 같은데 단지 파일경로를 나타낸다는데 차이가 있습니다.
3번은 약간 다른 구조를 같는데요, 일단 fs::path 클래스는 기본적으로 유닉스(리눅스) 경로는
기본으로 사용하고 있는듯 합니다.(자세한 사항은 직접 boost.org 를 통해 확인해 주세요^^)
따라서 만약 my_path( "c:\windows" ) 이런식의 생성은 예외를 발생합니다.
따라서 윈도우즈 환경에서 경로를 생성하려면 두번째 인자에 fs::native 라는 옵션을 주어야
아하! 너는 윈도우 환경이고 윈도우용 경로를 만들려고 하는구나 하고
지가 알아서 생성해 줄겁니다.
4번의 경우는 fs 라이브러리의 함수를 사용하는 겁니다.
위 함수는 현재 디렉토리를 리턴해 줍니다. 따라서 현재 이 프로그램의 경로를 나타냅니다.
일단 위의 path객체를 생성하셨다면 다양한 멤버 함수를 이용하실수 있습니다.
일단 기본적으로 가장 많이 사용하게될 멤버함수는 string() 입니다.
이 함수는 std::string 객체를 리턴합니다.
따라서 위에서 생성한(1번을 기준으로) 객체에서
std::string strPath = my_path.string();
위의 호출은 "c:/windows/system"이라는 경로를 리턴합니다. 경로 구분자가 가 아니라 / 이라는데 주의 하세요
위에서도 간단히 살펴보았듯 운영체제에 따라 다른경로가 사용됩니다.
운영체제에 따라 적절한 구분자를 사용하는 문자열을 리턴하는 함수는
native_directory_string()
가 되겠습니다.
따라서 my_path.native_directory_string() 위 호출은 c:windowssystem 을 갖는 string 객체를 리턴합니다.
사용이 간단하죠?
자. fs::path 클래스의 꽃이라고 볼수있는 / 연산자 재정의 부분을 살펴보겠습니다.
특히 이부분에서 역시 boost 라이브러리구나 하는것을 다시 느끼게 되었습니다.
만약 기존의 방식으로 파일의 경로를 추가 할때는 적어도 2~3줄의 코드를 사용하셨을 겁니다.
무슨 얘기 인고 하니, 예를 들어 보겠습니다.
만약 어떤 문자열이 "c:windows" 을 갖고 있다고 가정합시다.
거기다 "system32"라는 서브 디렉토리를 갖다가 붙인다고 가정해 볼게요.
그럼 대략적인 코드는 이렇습니다.
char * szPath = "c:\windows";
strcat(szPath , "\system32" );
사실 뭐 그리 복잡하지는 않네요.. 하지만 좀 뭐가 더티한 느낌이 남아 있죠?
만약 c:windows 가 아니라 c:window 으로 마지막에 이 하나 더 붙어 있으면
또 루틴을 달리에서 그냥 system32 라는 문자열만 붙이는등 아무튼 짜증 스럽네요^^;;
자 이제 fs::path에서는 어떻게 하는지 봅시다.
fs::path my_path("c:/windows");
my_path = my_path / "system32";
이 얼마나 간단 합니까...
/ 연산자의 재정의 아주 훌륭한 아이디어 입니다. 그쵸?
따라서 위의 my_path 는 c:/windows/system32를 갖게 됩니다.
ㅋㅋ 대단 대단~~
/ 연산자 말고도 /= 연산자도 있는데 그 의미는 같습니다.
fs::path my_path("c:/windows");
my_path /= "system32";
위의 코드와 똑같이 같습니다.
그럼 일단 이 정도가 가장 기본적인 내용들이고요..
한 두어가지 함수만 더 설명하고 첫강의를 마무리 하도록 하겠습니다.
그다음 살펴볼 함수가 leaf() 입니다.
이 함수는 가장 마지막 디렉토리나 화일명을 리턴합니다.
c:/windows/system32 의 leaf 는 system32 입니다.
c:/aaa/dddd/memo.txt 의 leaf 는 memo.txt 입니다.
보시는 바와 같이 기존에는 / 나 를 기준으로 tokenizing 하는 것들을 (사실 짜증나고 버그가
생길 가능성이 많겠죠?)
한가지 함수로 해결합니다.
마지막으로 볼 함수는 branch_path() 입니다. 이 함수는
부모 디렉토리의 fs::path 객체를 리턴합니다.
즉 c:/windows/aaa/ddd 의 부모경로는 c:/windows/aaa 가 되겠죠?
string을 리턴하는 것이 아닌 fs::path 객체를 리턴하는것 잊지 마세요~
그럼 일단 이정도에서 마무리 하겠습니다.
http://www.boost.org/libs/filesystem/doc/path.htm#synopsis
위의 경로에서 fs::path 클래스의 원형을 보실수 있고요.
함수는 몇가지 안되서 이것저것 써보시는 금방 다 아실수 있으실겁니다.
ㅋㅋ. 사실 강좌할 거리도 아닌데 강좌랍시고 했네요.
그냥 이런 좋은 클래스를 모든 여러분께 알려 드리고 싶었습니다.
그럼 filesystem 라이브러리를 이용해
조금이라도 편한 개발 하시길 바라면서 2부 강좌에서 다시 뵙도록 하겠습니다.
***************************************************
백택 (bektek@gmail.com)
홈페이지 : http://bektekk.wo.to
본 강좌는 위의 홈페이지 에서도 보실수 있습니다.
***************************************************