[C++] Visual Studio <std::filesystem> 사용하기


서론

https://github.com/pgh268400/FileChanger

기존에 대학교 프로젝트로 C언어를 이용해 파일 이름 변경기를 만든적이 있었습니다. C언어에는 string class도 없어서 문자열들을 배열에 동적으로 저장하고 싶으면 char[] 을 이용해서 동적할당으로 구현해야 했고, 이에 따른 버그가 다량으로 발생했습니다. (예를 들어서 파일 이름을 변경할 때 치환할 문자열이 너무 길거나 illegal 한 문자가 들어가면 프로그램이 그대로 튕겨버린다던가..., C에서는 예외처리 문법도 없습니다 ;;)

 

또한 디렉토리 내에 파일을 순회할 때 C언어에서 공식적으로 파일 시스템에 관한 기능이 제공되지 않아서

우회책으로 dirent.h 이라는 헤더 파일의 조금 수정된 버전을 이용해서 기능을 구현했던 기억이 납니다.

 

*dirent.h를 사용해서 디렉토리 순회하는 방법에 관한 글

 

그러던 중 위 프로젝트를 C++에서 제공되는 string, vector class 등을 이용해서, 구현을 C에서 C++로 전부 대체하면 버그를 잡아낼 수 있을 거 같았고, 특히 C++ 17 에서 나름의 최신 기능인 <std::filesystem> 을 이용하면 크로스 플랫폼 형태로 파일의 구조를 간단하게 읽어낼 수 있다는 것까지 알게되어 일종의 대대적 마이그레이션을 시행했습니다.

 

Visual Studio <std::filesystem> 사용하기

저는 Visual Studio 에서 <std::filesystem> 사용하려 했는데 Visual Studio의 기본 C++ 표준 자체가 C++ 14 로 설정되어 있어서 수정을 해야 사용이 됩니다.

 

분명 설정대로 수정을 했는데 자꾸 "namespace "std" has no member "filesystem" : 네임스페이스 "std"에 "filesystem" 멤버가 없습니다." 라는 오류가 떠서 몇일을 고생하다가 자세히 보니 저의 실수 때문이란 걸 알게 되어서 포스팅으로 남깁니다 ㅠㅠ

 

std::filesystem 은 원래 실험적 기능이였는데 C++ 17 표준에서 정식 기능으로 편입되었습니다. 디렉토리에 접근해서 파일목록을 읽어내는 기능이 2017년에서야 만들어졌다니.. 참 느리죠? 어떻게 보면 굉장히 최신 기능입니다.

 

서론이 조금 길어진 감이 있는데 Visual Studio 에서 <std::filesystem> 을 사용하는 방법을 알아봅시다.

 

우선 비주얼 스튜디오에서 본인의 프로젝트에서 Debug 에서 C++ 17을 적용할 것인지, Release 에서 적용할 것인지 생각을 하고 바꾸셔야 합니다. 저는 C++ 17로 바꾸면 Debug , Release 에서 전체적으로 적용이 되는줄 알았더니 자세히 보니 전부 따로 적용되는 것이더라구요..

 

우선 설정 방법은 매우 간단합니다. 프로젝트 속성에서 C++언어 표준 값을 바꿔주시면 됩니다.

파란색으로 표시된 부분에서 C++ 17 이나 만약에 C++의 제일 최신 기능을 쓰고 싶으시면 C++ latest 로 설정합니다. 주의 할점은 위에 빨간색 부분인데 아까전에 자기가 컴파일 하려는 환경과 위에서 설정한 내용이 동일해야 적용이 됩니다.

 

Debug, Release 에서 x86 이던 x64 던 관계없이 적용을 시키시려면 Debug , 모든 플랫폼 그리고 Release , 모든 플랫폼으로 맞춰놓고 저 설정을 각각 2번 적용하시면 되겠습니다.

 

저는 프로젝트 속성에서 Release 로 맞춰서 적용해놓고 컴파일 할땐 Debug 로 맞춰놓고 하려니 C++에서 std에 filesystem이 없다는 오류 메세지가 계속 떴고 이걸 Visual Studio 문제라고 생각해서 버리고 Dev C++로 옮겨서 작업하려다가 프로젝트 속성을 뒤지면서 알게 되었습니다. ㅎㅎ..

 

여러분들은 저 같은 실수 하지 마세요! (아마 이런 글이 검색해도 안나오는 걸 보면 이런 실수를 한게 아마 제가 처음일지도 모르겠네요..?)

 

 

https://github.com/pgh268400/FileChanger_CPP

결론적으로는 C++의 최신 기능을 이용해서 기존에 C로 짜여졌던 코드를 C++ 로 다시 구성해서 만들어냈습니다. 이제 버그도 없고 OOP 를 이용해서 디자인 했기 때문에 코드도 훨씬 간결해졌습니다. ㅎㅎ

* 사실 주요 함수는 다 버리고 새로 짠 것에 가깝습니다

 

C에 이것저것 추가하다가 괴물이 되어버린 C++을 까는 분들이 꽤 많은데, 산업 전반에 C가 아직 수 없이 많이 쓰이는건 사실이여도 저는 C++이 조금더 정감이 가는 거 같네요. (개인적 의견입니다.)

 

그래도 아직 C++ 전체 기능의 N할 정도만 아는 수준일듯..

 

https://github.com/pgh268400/FileChanger_CPP

 

COMMENT WRITE