본문 바로가기
C#

[C# Windows] System.IO.Path.GetTempPath 쓰지 마라.

by Falto 2023. 5. 9.

??? 대체 왜 결과가 저렇게 나오지?

Path.GetTempPath Method (System.IO) | Microsoft Learn

 

Path.GetTempPath Method (System.IO)

Returns the path of the current user's temporary folder.

learn.microsoft.com

위 문서에 따르면 해당 Method의 동작 원리는 아래와 같다. (리눅스는 내 알 바 아니니 Windows만 쓰겠다.)

  1. The path specified by the TMP environment variable.
  2. The path specified by the TEMP environment variable.
  3. The path specified by the USERPROFILE environment variable.
  4. The Windows directory.
  5. Path.GetTempPath Method는 위 네 가지 절차를 따른다. environment variable이 없으면 정상적으로 작동하지 않고 저렇게 C:\Users\%username%을 내뱉는다는 소리다.
  6. 마찬가지로 Path.GetTempFileName도 쓰지 마라. 당연히 이것도 유저 폴더 아래에 tmp 파일을 만든다.
  7. 그렇다면 tmp 폴더를 접근하려면 어떻게 해야 하는가?
  8. 이 글을 보는 모두가 알고 있듯이 tmp 폴더는 C:\Users\%username%\AppData\Local\Temp 이다. 와, 그렇다면 username 환경 변수를 알아내서 저기다 대입만 하면 되겠네??
  9. 하지만 environment variable이 정상적이지 않은 컴퓨터에 username이라고 정상적일 거라는 보장은 없다. GetTempPath의 잘못된 return 값이 C:\Users\%username%이라는 것을 이용해서 새로운 함수를 만들자.
  10. 근데 또 생각해보니 %username%이 비정상적이면 return 값이 저렇게 나올 수가 없다. 그리고 알아보니까 username 변수는 수정 못 함.
  11. 그럼 그냥 %username% 을 이용하자.
  12. 새로 만든 함수는 아래와 같다.
        public static string GetTempPath()
        {
            string username = Environment.GetEnvironmentVariable("username");
            if (username == null) throw new Exception();
            return $"C:\\Users\\{username}\\AppData\\Local\\Temp\\";
        }

GetEnvironmentVariable 함수는 환경 변수가 안 찾아지면 null을 반환한다. 만에 하나라도 username 변수가 없으면(당연히 있겠지만) 오류가 나게 했다.

temp 폴더가 없는 경우라던가 Path.GetTempFileName의 구현은 각자 알아서 하자.

이 세상의 모든 Windows C# 개발자들에게 이 글을 바친다.

 

+ 내가 고치던 버그가 환경 변수 때문인 줄 알았는데 username의 띄어쓰기 때문이었다. 당연히 큰 따옴표로 둘러싸는 것만으로도 해결이 되었고 쩝.. 따지고 보면 %userprofile%에도 파일 읽고 쓰기 권한 당연히 있어서 거기를 temp 폴더로 사용해도 프로그램상의 버그는 없을 것이다. 물론 사용자가 %userprofile%을 자주 들어가본다거나 하면 미관상 안 좋겠지만...

'C#' 카테고리의 다른 글

파일 읽고 쓰기의 비효율성  (0) 2023.05.27
class vs struct  (0) 2023.05.18
garbage collect의 함정  (0) 2023.03.25
개발자와 사용자의 관점 차이  (0) 2023.03.14
MultiBinding 간단한 예제  (0) 2023.03.11

댓글