Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

テンポラリーファイルが確実に削除されるように実装する

どういうこと?

テンポラリーファイルは使用後に自動的には削除されません。IDisposableを実装したラッパーを作成することで、確実に削除されるようにできます。

どうして?

Disposeメソッドでテンポラリーファイルを削除するように実装すれば、using句のスコープを抜けたときに確実にファイルが削除されるようになります。

どうすれば?

ソースコードを記載します。

using System;
using System.IO;

namespace Common {

    /// <summary>
    /// ディスク上に作成された一意な名前を持つ 0 バイトの一時ファイルを表します。
    /// 作成された一時ファイルは使用後に削除されます。
    /// </summary>
    public class TemporaryFile : IDisposable {

        /// <summary>
        /// 作成された一時ファイルのパス付きファイル名です。
        /// </summary>
        public string FullName {
            get {
                return this.fullName;
            }
        }
        private string fullName = Path.GetTempFileName();

        #region 終了処理

        /// <summary>
        /// ガベージ コレクションによってクリアされる前に、アンマネージ リソースを解放し、
        /// その他のクリーンアップ操作を実行します。 
        /// </summary>
        ~TemporaryFile() {
            Dispose();
        }

        private bool disposed = false;

        /// <summary>
        /// アンマネージ リソースの解放および終了処理を実行します。
        /// </summary>
        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// アンマネージ リソースの解放および終了処理を実行します。
        /// </summary>
        /// <param name="disposing">
        /// マネージ リソースとアンマネージ リソースの両方を解放する場合は true。
        /// アンマネージ リソースだけを解放する場合は false。
        /// </param>
        private void Dispose(bool disposing) {
            if (disposed) return;

            // アンマネージリソースを解放する。
            try { File.Delete(this.fullName); }
            catch { }

            disposed = true;
        }

    #endregion 終了処理

    }
}