🐝

一時フォルダ/ファイルを使用した処理後に必ず削除するメソッド

2023/03/12に公開

一時的にフォルダやファイルを使用し、最後に必ず削除したい場合に利用できるメソッドを作成しました。
一時フォルダ/ファイルの作成と削除を自動で行うので例外発生時などでも必ず削除されるためストレージを圧迫しません。
ソースはOSの一時フォルダを利用していますが適宜パスを変更しても問題ないです。

利用シーン

  • フォルダにファイルを複数作成しそれをzip化してダウンロード
  • ファイル生成後にバイト配列のみ利用

使い方

var file = TempResource.UseFile(filePath =>
{
    // filePathのファイルに対して書き込みなど何らかの処理

    // ここでは仮にバイト配列のみ戻り値として利用
    using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    var data = new byte[fs.Length];
    fs.Read(data, 0, data.Length);
    fs.Close();
    return data;
});

使用クラス/メソッド

/// <summary>
/// 一時リソースクラス。
/// </summary>
public static class TempResource
{
    /// <summary>
    /// 一時ファイルを使用した処理を実行する。
    /// </summary>
    /// <typeparam name="T">処理メソッドの戻り値の型。</typeparam>
    /// <param name="func">戻り値ありの処理メソッド。</param>
    /// <returns>処理メソッドの戻り値。</returns>
    /// <remarks>作成された一時ファイルは処理メソッド実行後に削除される。</remarks>
    public static T UseFile<T>(Func<string, T> func)
    {
        var path = string.Empty;
        try
        {
            // 一時フォルダに作業用のファイルを作成
            path = Path.GetTempFileName();
            //using var fs = File.Create(path);
            //fs.Close();

            // 一時ファイルに対して処理
            return func(path);
        }
        finally
        {
            if (File.Exists(path))
            {
                File.Delete(path);
            }
        }
    }

    /// <summary>
    /// 一時ファイルを使用した処理を実行する。
    /// </summary>
    /// <param name="act">戻り値なしの処理メソッド。</param>
    /// <remarks>作成された一時ファイルは処理メソッド実行後に削除される。</remarks>
    public static void UseFile(Action<string> act)
    {
        _ = UseFile(path =>
        {
            // 一時ファイルに対して処理
            act(path);
            return true;
        });
    }

    /// <summary>
    /// 一時フォルダを使用した処理を実行する。
    /// </summary>
    /// <typeparam name="T">処理メソッドの戻り値の型。</typeparam>
    /// <param name="func">戻り値ありの処理メソッド。</param>
    /// <returns>処理メソッドの戻り値。</returns>
    /// <remarks>作成された一時フォルダは処理メソッド実行後に削除される。</remarks>
    public static T UseFolder<T>(Func<string, T> func)
    {
        var path = string.Empty;
        try
        {
            // 一時フォルダに作業用のサブフォルダを作成
            path = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
            Directory.CreateDirectory(path);

            // 一時フォルダに対して処理
            return func(path);
        }
        finally
        {
            if (Directory.Exists(path))
            {
                Directory.Delete(path, true);
            }
        }
    }

    /// <summary>
    /// 一時フォルダを使用した処理を実行する。
    /// </summary>
    /// <param name="act">戻り値なしの処理メソッド。</param>
    /// <remarks>作成された一時フォルダは処理メソッド実行後に削除される。</remarks>
    public static void UseFolder(Action<string> act)
    {
        _ = UseFolder(path =>
        {
            // 一時フォルダに対して処理
            act(path);
            return true;
        });
    }
}

Discussion