현재 사용자의 임시 폴더를 얻는 방법


395

현재 다음 기능을 사용하여 현재 사용자의 임시 폴더 경로를 가져옵니다.

string tempPath = System.IO.Path.GetTempPath();

일부 컴퓨터에서는 다음과 같이 현재 사용자의 임시 폴더 경로를 제공합니다.

C : \ 문서 및 설정 \ 관리자 \ 로컬 설정 \ 온도 \

일부 컴퓨터에서는 다음과 같은 시스템 임시 폴더 경로를 제공합니다.

C : \ Windows \ TEMP

MSDN Documentation은 또한 위의 API가 현재 시스템의 임시 폴더를 반환한다고 말합니다.

다음과 같이 현재 사용자의 임시 폴더 경로를 제공하는 다른 API가 있습니까?

C : \ 문서 및 설정 \ 관리자 \ 로컬 설정 \ 온도 \


2
System.Environment.GetEnvironmentVariable ( "TEMP")의 동작은 GetTempPath ()와 동일합니다. 내 컴퓨터에서 'administrator'계정의 경우 두 API가 모두 "C : \ WINDOWS \ TEMP"를 반환하지만 'Network Service'계정의 경우 두 API가 모두 "C : \ Documents and Settings \ Network Service \ Local Settings \ Temp \"를 반환합니다.
Anoop

1
아마도 '관리자'계정에 임시 폴더 C : \ Windows \ Temp가 있습니까?
Helen

2
C : \ Documents and Settings \에서 항상 임시 경로를 가져 오려는 특별한 이유가 있습니까?
Noldorin 2016 년

11
참고 : 당신이 경우 않습니다 아닌 사용자 (설정된 경우) 당신은 Environment.GetEnvironmentVariable ( "온도", EnvironmentVariableTarget.Machine)를 사용할 수있는 시스템 임시 폴더를 원하는
piers7

1
과거에는 임시 폴더를 자주 사용했지만 정리가 가능하여 디스크가 완전히 소비되지 않는 한 원래 위치에 신경 쓰지 않았습니다. 임시 자리 표시 자-정크 플레이스 홀더가 아닌 임시 폴더입니까? API로 알 수없고 처리 할 수없는 이유는 무엇입니까? 임시 위치 대신 구성 가능하고 잘 알려진 위치를 사용해야합니까?
barrypicker

답변:


405

System.IO.Path.GetTempPath()GetTempPath(..)Kernel32에서 기본 호출을위한 래퍼 일뿐 입니다.

http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx를 살펴보십시오 .

해당 페이지에서 복사 :

GetTempPath 함수는 다음 순서로 환경 변수가 있는지 확인하고 발견 된 첫 번째 경로를 사용합니다.

  • TMP 환경 변수로 지정된 경로입니다.
  • TEMP 환경 변수로 지정된 경로입니다.
  • USERPROFILE 환경 변수로 지정된 경로입니다.
  • Windows 디렉토리

"Windows 디렉토리"가 windows 아래의 temp 디렉토리인지 Windows 디렉토리 자체인지는 명확하지 않습니다. Windows 디렉토리 자체에 임시 파일을 덤프하는 것은 바람직하지 않은 경우처럼 들리지만 누가 아는가.

따라서 해당 페이지를 게시물과 결합하면 관리자 사용자의 TMP, TEMP 또는 USERPROFILE 변수 중 하나가 Windows 경로를 가리 키거나 설정되지 않고 Windows 임시 경로로 대체되고 있다고 생각합니다.


14
TEMP환경 변수는 두 곳에서 설정됩니다 : 사용자 자체, 로컬 시스템에 대한. 사용자에 대해 설정되어 있지 않으면 로컬 컴퓨터 용으로 사용되며 항상 기본 설치로 설정됩니다. 따라서 검색은 일반적으로 두 번째 단계에서 중지됩니다. , 경우 테스트에서 TMP, TEMP그리고 USERPROFILE모든 해제, 그것은 실제로 수행 에 가을 다시 %SystemRoot%( C:\Windows\).
Bob

1
"로컬 시스템"에서 실행되는 Windows 서비스 또는 이러한 서비스에 의해 시작된 응용 프로그램에서 실행되는 코드 인 C : \ Windows \ Temp 폴더는 종종 용어 폴더로 사용됩니다.
NineBerry

1
링크의 문서는 "반환 된 문자열은 백 슬래시 (예 :"C : \ TEMP ")로 끝나지만 실제로는 백 슬래시로 끝나지 않습니다"
dcp

응용 프로그램에서 해당 기능이 리턴 한 경로에 대한 쓰기 권한이 있다고 보장하지는 않습니다. IsolatedStorage를 대신 사용하면 어떨까요?
John

35

이것을 사용 하지 마십시오 :

System.Environment.GetEnvironmentVariable("TEMP")

환경 변수를 재정의 할 수 있으므로 TEMP변수가 반드시 디렉토리 일 필요는 없습니다.

올바른 방법은 System.IO.Path.GetTempPath()허용 된 답변과 같이 사용 하는 것입니다.


34
@ImmortalBlue 반드시 temp 디렉토리가 아니기 때문입니다. temp 디렉토리를 얻는 올바른 방법은을 호출하는 것 System.IO.Path.GetTempPath()입니다.
David Heffernan

9
나는 이것이 꽤 오래되었다는 것을 알고 있지만 궁금한 사람에게는 메모를 남길 것이라고 생각했다. .NET에는 큰 문제가 아니지만 악의적 인 사용자가 프로그램을 악용하기 위해 해당 환경 변수를 변경했을 수 있기 때문에 나쁜 습관으로 간주됩니다. 관리자 권한으로 실행 중이고 맬웨어가 코드를 실행하는 동안 코드를 변경할 수있는 경우, 예를 들어 쉘 코드가 TEMP에 저장되어 있기 때문에 관리자로 쉘 코드를 실행할 수 있습니다.
sraboy

GetEnvironmentVariable("TEMP")와 사이에는 두 가지 주요 차이점이 있습니다 GetTempPath(). GetTempPath()먼저 "TMP"변수를 확인한 다음 "TEMP"및 마지막으로 "USERPROFILE"을 확인합니다. 해당 폴더를 찾지 못하면 Windows 폴더의 경로를 반환합니다. 또한 올바른 경로를 반환하지만 경로가 존재한다고 보장하지는 않습니다.
Logman

그러나 이것은 TMP 변수가없는 경우 (최근 Windows 버전의 기본 시나리오) 받아 들일 수있는 대답입니다. 그렇지 않습니까?
PRMan

1
GetTempPath커널 문서를 읽으면 환경 변수에 의존하므로 사용자 Logman이 지적한대로 사용하지 않을 이유가 없습니다 GetEnvironmentVariable... 모두 동일한 약점을 가지고 있습니다.
AnorZaken

22

동일한 요구 사항이 있습니다. 환경 내에 존재 해야하는 특정 루트 디렉토리에 로그를 넣고 싶습니다.

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

이것을 하위 디렉토리와 결합하려면을 사용할 수 있어야합니다 Path.Combine( ... ).

GetFolderPath방법에는 지정된 경로를 만들지 또는 간단히 확인할지 여부를 제어 할 수있는 특수 폴더 옵션에 대한 과부하가 있습니다.


-8

시험

Environment.GetEnvironmentVariable("temp");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.