9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

.NETにおけるTMP/TEMPの扱いについて

Last updated at Posted at 2017-12-04

概要

.NETで一時的なファイルを扱いたい場合、テンポラリフォルダのパスをSystem.Path.GetTempPath()で取得できるが、実際に利用する場合には詳細な動きも頭の片隅に入れておきたいので調べてみた。

GetTempPath()メソッドで取得できるフォルダ

公式リファレンスによると、このメソッドで返されるのは以下の順に走査して最初に見つかったフォルダである。

  1. TMP 環境変数によって指定されたパス。
  2. TEMP 環境変数で指定されたパス。
  3. %USERPROFILE% 環境変数によって指定されたパス。1
  4. Windows ディレクトリ。2

実際にソースを追ってみたところ、Path.GetTempPathはWin32APIのGetTempPath関数に処理を委譲しているだけだった。

ただ、Win32APIのGetTempPath関数の日本語リファレンスには上記3.の記載がない。英語リファレンスには記載されているため、日本語版の内容が古いか単に誤っていると思われる。

環境変数の優先順位

TMP,TEMP,USERPROFILEは環境変数であるため、以下の優先順位が存在する(上が優先)

  1. プロセス内でセットされた環境変数3
  2. ユーザー環境変数
  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確保してても容量不足で落ちて原因がなかなかわからず苦労したことが何回かあった。

大量のファイルや大きいファイルを一時ファイルとして扱うことが予めわかっている場合は、事前に空き容量のチェックをして警告を出すなり、最適な場所を利用するようにしたい(して欲しい)。

  1. %USERPROFILE%についてはこちらに記載。

  2. システム環境変数SystemRootが指すフォルダを意味していると思われる。通常はC:\WINDOWS

  3. プログラム内部でSystem.Environment.SetEnvironmentVariable("TEMP", "C:\hoge")で上書きされた場合など。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?