C#で一時フォルダを扱う

C# で Windows の一時フォルダと一時ファイルパスの取得は以下関数を使用すると取得できます。

  • 一時フォルダの取得は「Path.GetTempPath()」
  • 一時ファイルの取得は「Path.GetTempFileName()」

但し、GetTempFileNameはファイルパスを取得できますがファイル自体は存在しません。従って File.Create(Path.GetTempFileName()) のようにパスヵらファイルを生成するする必要があります。

各メソッドの使用方法は以下の通りです。

// 一時フォルダの取得
string tempDir = Path.GetTempPath();
Console.WriteLine(tempDir);
> C:\Users\${ユーザー名}\AppData\Local\Temp\

// 一時ファイルの取得
string tempFilePath = Path.GetTempFileName();
Console.WriteLine(tempFilePath);
> C:\Users\${ユーザー名}\AppData\Local\Temp\tmp1AA9.tmp

一時フォルダを取得すると一時フォルダのルートが取れます。

ですが、一時フォルダを使用すると、大抵は、以下のような処理を定形的に行うので一連の操作をライブラリ化しようと思います。

  1. 一時フォルダ以下にサブフォルダを作成
  2. 中で作業する
  3. 最後にフォルダを消す

作業後に自動的にフォルダが消えるようにする

まず、実装例は以下の通りです。

具体的な作業内容はラムダで受けるので、開始前と終了時にフォルダを一時領域に作成・削除だけ記述しています。

public static class TempResource
{
    // 使用後に消える一時フォルダを使用するためのコンテキストを提供します。
    public static void FolderContext(Action<string> f)
    {
        string path = string.Empty;
        try
        {
            // 一時フォルダに作業用のサブフォルダを作成
            path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
            Directory.CreateDirectory(path);

            f(path);
        }
        finally
        {
            if (Directory.Exists(path))
            {
                Directory.Delete(path, true);
            }
        }
    }
}

次に使い方です。

static void Main(string[] args)
{
    TempResource.FolderContext(path =>
    {
        Console.WriteLine(path);
        > C:\Users\${ユーザー名}\AppData\Local\Temp\536c686a-9a7c-4a5d-83dd-f3b46bc2625f

        // 作業フォルダ内にファイルを作成
        using (var file = File.CreateText(Path.Combine(path, "a.txt")))
        {
            file.WriteLine("test");
        }
    });

    // コンテキストを抜けるとフォルダが消えている
}

簡単ですが以上です。