Path.GetTempPath Method (System.IO) | Microsoft Learn
위 문서에 따르면 해당 Method의 동작 원리는 아래와 같다. (리눅스는 내 알 바 아니니 Windows만 쓰겠다.)
- The path specified by the TMP environment variable.
- The path specified by the TEMP environment variable.
- The path specified by the USERPROFILE environment variable.
- The Windows directory.
- Path.GetTempPath Method는 위 네 가지 절차를 따른다. environment variable이 없으면 정상적으로 작동하지 않고 저렇게 C:\Users\%username%을 내뱉는다는 소리다.
- 마찬가지로 Path.GetTempFileName도 쓰지 마라. 당연히 이것도 유저 폴더 아래에 tmp 파일을 만든다.
- 그렇다면 tmp 폴더를 접근하려면 어떻게 해야 하는가?
- 이 글을 보는 모두가 알고 있듯이 tmp 폴더는 C:\Users\%username%\AppData\Local\Temp 이다. 와, 그렇다면 username 환경 변수를 알아내서 저기다 대입만 하면 되겠네??
- 하지만 environment variable이 정상적이지 않은 컴퓨터에 username이라고 정상적일 거라는 보장은 없다. GetTempPath의 잘못된 return 값이 C:\Users\%username%이라는 것을 이용해서 새로운 함수를 만들자.
- 근데 또 생각해보니 %username%이 비정상적이면 return 값이 저렇게 나올 수가 없다. 그리고 알아보니까 username 변수는 수정 못 함.
- 그럼 그냥 %username% 을 이용하자.
- 새로 만든 함수는 아래와 같다.
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 |
댓글