概要
.NETで一時的なファイルを扱いたい場合、テンポラリフォルダのパスをSystem.Path.GetTempPath()
で取得できるが、実際に利用する場合には詳細な動きも頭の片隅に入れておきたいので調べてみた。
GetTempPath()メソッドで取得できるフォルダ
公式リファレンスによると、このメソッドで返されるのは以下の順に走査して最初に見つかったフォルダである。
実際にソースを追ってみたところ、Path.GetTempPath
はWin32APIのGetTempPath
関数に処理を委譲しているだけだった。
ただ、Win32APIのGetTempPath
関数の日本語リファレンスには上記3.の記載がない。英語リファレンスには記載されているため、日本語版の内容が古いか単に誤っていると思われる。
環境変数の優先順位
TMP,TEMP,USERPROFILEは環境変数であるため、以下の優先順位が存在する(上が優先)
- プロセス内でセットされた環境変数3
- ユーザー環境変数
- システム環境変数
System.Environment.GenEnvironmentVariable(string, EnvironmentVariableTarget)
メソッドを利用すれば、個別に取得もできる。
System.Environment.GenEnvironmentVariable("TEMP", EnvironmentVariableTarget.Process)
System.Environment.GenEnvironmentVariable("TEMP", EnvironmentVariableTarget.User)
System.Environment.GenEnvironmentVariable("TEMP", EnvironmentVariableTarget.System)
気をつけたいこと
TEMPファルダを利用する際に容量が不足して落ちるプログラムが世の中に沢山ある。
というか、個人的にRAMドライブをTEMPに割り当ててるが、2GB確保してても容量不足で落ちて原因がなかなかわからず苦労したことが何回かあった。
大量のファイルや大きいファイルを一時ファイルとして扱うことが予めわかっている場合は、事前に空き容量のチェックをして警告を出すなり、最適な場所を利用するようにしたい(して欲しい)。