2

アプリケーションが停止すると自動的に削除される一時ディレクトリを使用したいと思います。

そのようなメカニズムはフレームワークに存在しますか、それとも自分でプログラムする必要がありますか?

ありがとう !

4

4 に答える 4

3

それを行う組み込みのものは何もありません。起動時にフォルダーを作成し、そのフォルダー内のファイルをロックして、別のプロセスによる削除を防ぐことができますが、それで十分だと確信しています。

アプリが実行されていない場合にこのフォルダーがまったく存在しないことが重要な場合は、アプリとフォルダーの両方の状態を監視するサービスが必要になります。このようにして、アプリがクラッシュしたり、コンピューターが再起動したりした場合、これらのシナリオのいずれかを過ぎると、フォルダーにアクセスできないことが (合理的に) 確実になります。もちろん、起動時にサービスを自動的に開始する必要があります。

于 2014-02-21T14:28:19.450 に答える
2

私の知る限り、ディレクトリの組み込みメソッドは存在しませんが、使い捨てクラスとusing構成を作成することで、その動作を簡単に模倣できます。これにより、アプリが予期せず終了した場合でもフォルダーが確実に削除されます。

public class TempFolder : IDisposable
{
    public string RootPath { get; private set; }

    public TempFolder()
    {
        RootPath = Path.GetTempPath();
    }

    public void Dispose()
    {
        Directory.Delete(RootPath, true);
    }
}

次に、アプリケーションで次のようにします。

パブリック静的クラス MyApp {

public static void Main(string[] args)
{
    using(var tempFolder = new TempFolder())
    {

        // Do my stuff using tempFolder.RootPath as base path to create new files
    }

    // temporal directory will be deleted when we reach here
    // even if an exception is thrown! :)
}

}

これは単純化したアプローチであることに注意してください。一時ディレクトリ内のロックされたファイルに注意してください。Directory.Delete操作が失敗する可能性があります

また、場合によっては、Disposeメソッドを呼び出すことができませんでした:

  • StackOverflowExceptionおよびのようないくつかのキャッチできない例外OutOfMemoryException
  • アプリケーションによって生成された別のスレッドで、キャッチされていない例外がスローされます。
  • プロセスが殺される

ところで、ファイルを操作する必要があるいくつかの NUnit テストを処理するために同様のアプローチを使用していますが、これまでのところ正常に動作しています。

于 2014-02-21T14:35:30.070 に答える
1

また、アプリケーションが通常とは異なる方法で終了する可能性があることにも注意してください。たぶん、コンピューターの電源を切ることさえあります。そのため、プログラムを再起動したときに、フォルダーが既に存在している可能性があります。

于 2014-02-21T14:29:59.507 に答える
0

Windows API は、ファイルへの最後のハンドルが閉じられたときにファイルが削除されるように作成されるファイルをサポートしています。ただし、ディレクトリにそのようなものが存在するかどうかはわかりません。System.IO.File.CreateFile();および説明を参照してくださいFileOptions.DeleteOnClose。また、基になる Win32 APIも調べてください。おそらく、ニーズに合わせて調整できます。

于 2014-02-21T14:37:04.373 に答える