14

Windows Forms .NET 3.5 アプリケーションでいくつかの一時ファイルを操作する必要があります。これらのファイルは、もちろん自分のプログラムよりも長時間実行できる外部アプリケーションで開かれます。

ユーザーのハードディスクが不要な「ジャンク」ファイルでいっぱいになるのを避けるために、これらの一時ファイルがいつでもクリーンアップされるようにするためのベスト プラクティスはありますか? それとも、Windows でさえこれを自動的に処理しますか?

良い例はメール クライアントです。アプリケーションで添付ファイルを開くと、通常、開いている一時ファイルに書き込まれます。これらのファイルがクリーンアップをどのように管理しているかを把握する方法はありますか?

Google を使用すると、手動で一時ディレクトリをクリーンアップするための非常に多くのクリーンアップ ツールとチューンアップ ツールが表示されますが、ユーザーにそうするよう強制したくありません。:-)

4

8 に答える 8

28

.NET では、このTempFileCollectionクラスを使用して、アプリケーションによってクリーンアップされる一連の一時ファイルを管理できます (CodeDom 名前空間ではむしろ隠されていることに注意してください)。ファイルが別のアプリケーションによって開かれている可能性があるため、自分が所有していないファイルを削除することはできません (削除すると重大な問題が発生する可能性があります)。

于 2009-03-18T17:41:02.510 に答える
7

一時ファイルをクリーンアップする責任は、一時ファイルを作成したアプリケーションにあるはずです。これはとても簡単だ。次のようなクラスを使用します。

public class TempFile : IDisposable
{
    public TempFile()
    { this.path = System.IO.Path.GetTempFileName(); }

    public void Dispose()
    { File.Delete(path); }

    private string path;
    public string Path { get { return path; } }
}

別のアプリケーションの一時ファイルをクリーンアップする必要がある場合は、そのアプリケーションと通信する何らかの手段が必要です。少なくとも、セマフォを提供できる必要があります。ただし、これを行うことの複雑さは、元のアプリケーションに独自のファイルを処理させることの複雑さよりも大きくなります。

于 2009-03-18T19:01:46.247 に答える
5

一時ファイル タイプのフォルダーの内容を確定的に消去しようとすると、他のプロセスで使用されているファイルが削除される危険があります。Windows オペレーティング システムには、ボリュームの使用可能なディスク容量が特定のしきい値に達したときに、ユーザーがこれらのファイルを削除できるツールが用意されています。

ここで、特定の一時ファイルを使用した後に必要がなくなると判断できる場合は、その特定のファイルを削除しても問題はありません。

于 2009-03-18T17:40:21.327 に答える
1

ASP.NETで一時ファイルを使用する場合は、PAGE_DISPOSEDイベントを使用して、ページで作成した一時ファイルをすべて削除します。そうしないと、破棄されるまで手放さないコンポーネントとの競合が発生する可能性があります。

于 2009-08-06T19:20:55.597 に答える
1

私はこのソリューションを使用します(非常に信頼できます):

using System.IO;
using System.Reflection;

namespace Konard.Helpers
{
    public static partial class TemporaryFiles
    {
        private const string UserFilesListFilenamePrefix = ".used-temporary-files.txt";
        static private readonly object UsedFilesListLock = new object();

        private static string GetUsedFilesListFilename()
        {
            return Assembly.GetEntryAssembly().Location + UserFilesListFilenamePrefix;
        }

        private static void AddToUsedFilesList(string filename)
        {
            lock (UsedFilesListLock)
            {
                using (var writer = File.AppendText(GetUsedFilesListFilename()))
                    writer.WriteLine(filename);
            }
        }

        public static string UseNew()
        {
            var filename = Path.GetTempFileName();
            AddToUsedFilesList(filename);
            return filename;
        }

        public static void DeleteAllPreviouslyUsed()
        {
            lock (UsedFilesListLock)
            {
                var usedFilesListFilename = GetUsedFilesListFilename();

                if (!File.Exists(usedFilesListFilename))
                    return;

                using (var listFile = File.Open(usedFilesListFilename, FileMode.Open))
                {
                    using (var reader = new StreamReader(listFile))
                    {
                        string tempFileToDelete;
                        while ((tempFileToDelete = reader.ReadLine()) != null)
                        {
                            if (File.Exists(tempFileToDelete))
                                File.Delete(tempFileToDelete);
                        }
                    }
                }

                // Clean up
                using (File.Open(usedFilesListFilename, FileMode.Truncate)) { }
            }
        }
    }
}

一時ファイルの使用が必要になるたびに:

var tempFile = TemporaryFiles.UseNew();

アプリケーションの終了またはクラッシュ後にすべての一時ファイルが確実に削除されるようにするには

TemporaryFiles.DeleteAllPreviouslyUsed();

アプリケーションの開始時。

于 2014-11-19T14:03:46.207 に答える
0
  • プロセス中に作成されたファイル名を書き続けることができる1つの一時ファイルを作成できます。処理の最後に、操作の完了後にDisponseメソッドで(前提条件-IDisposableを実装して)削除することができます。

  • もう1つの方法は、間隔ごとにクリーンアップを実行する独立したプロセスを作成することです。

  • ファイルの最後に日付を添付し、その日付で1日の終わりに削除すると、プロセスは最後に新しい日付で新しいファイルを生成します。

  • divotempfilecollectionクラスによって与えられた1つの良い提案。

それが役に立てば幸い。

于 2009-08-06T19:28:26.050 に答える