現在のユーザーの一時フォルダーを取得する方法


395

現在、次の関数を使用して現在のユーザーの一時フォルダーパスを取得しています。

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

一部のマシンでは、次のような現在のユーザーの一時フォルダーパスが表示されます。

C:\ Documents and Settings \ administrator \ Local Settings \ Temp \

一部のマシンでは、次のようなシステム一時フォルダパスが表示されます。

C:\ Windows \ TEMP

MSDNドキュメントでは、上記のAPIは現在のシステムの一時フォルダーを返すとも述べています。

次のように、現在のユーザーの一時フォルダーパスを取得できる他のAPIはありますか?

C:\ Documents and Settings \ administrator \ Local Settings \ Temp \


2
System.Environment.GetEnvironmentVariable( "TEMP")の動作は、GetTempPath()と同じです。私のマシンでは、アカウント「administrator」の両方のAPIが「C:\ WINDOWS \ TEMP」を返しますが、アカウント「ネットワークサービス」の両方のAPIは「C:\ Documents and Settings \ Network Service \ Local Settings \ Temp \」を返します。
Anoop、

1
おそらく「管理者」アカウントには、C:\ Windows \ Tempという一時フォルダがありますか?
Helen

2
常にC:\ Documents and Settings \の下に一時パスを取得する特定の理由はありますか?
ノルドリン2009年

11
FYI:あなたがいる場合、システムの一時フォルダではなく、ユーザーの(設定されている場合)したいあなたはEnvironment.GetEnvironmentVariable(「TEMP」、EnvironmentVariableTarget.Machine)を使用することができます
piers7

1
以前は、一時フォルダーを頻繁に使用しており、ディスクが完全に消費されないようにクリーンアップを実行できる限り、それがどこにあるかを気にしていませんでした。一時的な使用のための一時フォルダのポイントではありません-ジャンクプレースホルダー?なぜ不明でAPIで処理できないのですか?tempの代わりに、構成可能な既知の場所を使用する必要がありますか?
バリーピッカー2014

回答:


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の下の一時ディレクトリを意味するのか、Windowsディレクトリ自体を意味するのかは、私には完全には明らかではありません。Windowsディレクトリ自体に一時ファイルをダンプすることは望ましくないケースのように聞こえますが、誰もが知っています。

したがって、そのページを投稿と組み合わせると、管理者ユーザーのTMP、TEMP、またはUSERPROFILE変数のいずれかがWindowsパスを指すか、そうでない場合は設定されておらず、Windows一時パスへのフォールバックが発生していると思います。


14
TEMP環境変数は、2つの場所に設定されます。ユーザー自身のため、そしてローカルマシンのために。ユーザー用に設定されていない場合は、ローカルマシン用のものが使用され、デフォルトのインストールでは常に設定されます。したがって、通常、検索は2番目のステップで停止します。テストではTMPTEMPUSERPROFILEがすべて未設定の場合、実際に%SystemRoot%C:\Windows\)にフォールバックします。
ボブ

1
「ローカルシステム」で実行されるWindowsサービスまたはそのようなサービスによって開始されたアプリケーションで実行されるコードでは、C:\ Windows \ Tempフォルダーが用語フォルダーとして使用されることがあります。
NineBerry

1
\ TEMP 『しかし、彼らの例では、実際にはバックスラッシュで終わっていない:「バックスラッシュと返された文字列が終了すると、例えば、』 C:あなたのリンクからドキュメントはこの言う。。
DCP

アプリケーションでその関数によって返されるパスへの書き込み権限があることは保証されません。代わりにあなたがIsolatedStorageを試した場合はどうですか?
John

35

これは使用しないでください

System.Environment.GetEnvironmentVariable("TEMP")

環境変数は上書きできるため、TEMP変数は必ずしもディレクトリである必要はありません。

正しい方法はSystem.IO.Path.GetTempPath()、受け入れられた回答のように使用することです。


34
@ImmortalBlueこれは必ずしも一時ディレクトリではないためです。一時ディレクトリを取得する正しい方法は、を呼び出すことSystem.IO.Path.GetTempPath()です。
David Heffernan 2013

9
私はこれがかなり古いことを知っていますが、興味がある人にはメモを残したいと思っていました。@ DavidHeffernanが言ったように、必ずしも一時ディレクトリではないだけでなく、それが何であるかわかりません。.NETにはそれほど問題はありませんが、悪意のあるユーザーがプログラムを悪用するためにその環境変数を変更した可能性があるため、これは不適切なプラクティスと見なされています。管理者権限で実行していて、マルウェアが実行中にコードを変更できる場合、TEMPに格納されているため、たとえば、シェルコードを管理者として実行できます。
sraboy 2015年

との主な違いは2つGetEnvironmentVariable("TEMP")ありGetTempPath()ます。GetTempPath()最初に「TMP」変数、次に「TEMP」、最後に「USERPROFILE」をチェックします。それらが見つからない場合は、Windowsフォルダーへのパスを返します。また、正しいパスを返すことを保証しますが、パスが存在することを保証するものではありません。
Logman、2017年

しかし、これは、TMP変数(最近のWindowsバージョンのデフォルトのシナリオ)がない場合に受け入れられる回答とまったく同じです。
PRMan

1
GetTempPathいずれにしても、カーネルのドキュメントを読んだ場合、環境変数に依存しているため、ユーザーLogmanが指摘するように、使用しない理由はありませんGetEnvironmentVariable...どちらにも同じ弱点があります。
AnorZaken

22

これと同じ要件があります。環境内に存在する必要がある特定のルートディレクトリにログを配置したいと考えています。

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

これをサブディレクトリと組み合わせる場合は、を使用できるはずPath.Combine( ... )です。

このGetFolderPathメソッドには、指定されたパスを作成するか単に検証するかを制御できる特別なフォルダーオプションのオーバーロードがあります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.