[C#] 시스템의 특별한 폴더 경로 가져오기 (Environment.GetFolderPath)

Special Directories

  스페셜 폴더는 이름에서 알 수 있듯 OS에 존재하는 여러 특별한 폴더들을 말합니다. 가장 흔히 접할 수 있는 스페셜 폴더로는 내 문서, 내 그림, 내 동영상 폴더들이 있죠.
  더 많은 스페셜 폴더는 이 링크를 클릭해 확인해보세요.

Special Directory를 사용해야 하는 상황?

  프로그래밍을 하다 보면, 심심치 않게 이런 특별한 폴더들을 사용해야만 하는 경우가 생깁니다. 게임을 예로 들어볼까요? 스타크래프트 2, HOTS 등 여러 블리자드의 게임은 저장소, 리플레이 등을 저장하기 위해 내 문서 폴더를 사용합니다. 이렇게 말로 하면 굉장히 간단하게 느껴지지만, 코딩을 생각보단 복잡할 수 있습니다.


var myDocumentPath = $@"{_systemDrive}:\Users\{_userName}\Documents"; // 윈도우 Vista 이상
myDocumentPath = $@"{_systemDrive}:\Documents And Settings\{_userName}\My Documents"; // XP


  내 문서 경로를 구하기 위해, 시스템 드라이브(C:인지, D:인지, E:인지, ...)를 알아내야 하고, 현재 로그온한 사용자의 이름의 짧은 버전을 알아내서 조합해야만 합니다. 이 얼마나 복잡한가요. 심지어 OS 버전별로 다 다른 경로도 있기에, 그에 따른 처리까지 해줘야 합니다. 위의 경우는 %USERPROFILE% 폴더가 XP에서는 %SYSTEMDRIVE%\Documents And Settings\%USERNAME%이지만, VISTA 이상에서는 %SYSTEMDRIVE%\Users\%USERNAME%이죠.

  바로 이럴 때 미리 정의된 Special Directory의 경로를 가져오는 기능을 사용하면 아주 간편합니다.

System.Environment.GetFolderPath(SpecialFolder folder)

  그리고 당연하게도 해당 기능은 .Net Framework에 구현되어 있습니다. 물론 .Net Core에도 정의돼 있습니다.

  System.Environment.GetFolderPath의 첫 번째 인수로 SpecialFolder 열거형의 값을 넘기면, 해당 SpecialFolder의 경로가 반환됩니다. 예를 들어 다음과 같은 상황이라고 생각해봅시다.

1. 프로그램이 설정 파일을 어떠한 이유로 프로그램 폴더가 아닌 %APPDATA%\{ProgramName} 폴더에 저장해야 한다. (ClickOnce 배포 등의 이유로, 업데이트 할 때마다 프로그램 폴더가 변경되거나 초기화되는 경우 등등)

  그럼 이제 우리는 %APPDATA%에 해당하는 폴더 경로를 가져와야만 합니다. Environment.GetFolderPath 메서드가 없었다면 이것 저것 할 일이 많았겠지만, 이제 단 한 줄로 구할 수 있게 됐습니다.

var appDataPath = Environment.GetFolderPath(SpecialFolder.ApplicationData);

  짜잔. 이제 appDataPath에는 각각의 사용자, OS 버전, 컴퓨터마다 다른 %APPDATA%의 경로가 들어가게 됐습니다. 이제 해당 값을 가지고 폴더를 만들어, 설정 파일을 그곳에 저장하면 됩니다!

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭