12

Windows で C コード (C++ や C# ではない) から一意の一時ディレクトリを作成したいと考えています。これを実行して、いくつかの一時ファイルをディレクトリに配置し、完了したらそれらをすべて簡単に削除できるようにします (ディレクトリを再帰的に削除することにより)。

私は基本的に、Linux mkdtemp 機能に相当するものを探しています。ここにC# の回答があり、この質問に対する回答 は Boost の使用を提案しています。しかし、私は C を使用しているため、これらのソリューションはうまくいきません。

これまでに思いついた最善の方法は、に GetTempFileName 続けて使用するCreateDirectoryことですが、問題は GetTempFileName 、一意のファイル名を作成するように要求すると、ファイルも作成されることです(これは望ましくないため、代わりにディレクトリを作成したい)。

関連して、 GetTempPath環境変数からユーザーの一時フォルダーの場所を返す がありますが、後で安全に削除できる独自のディレクトリを作成したいので、返されるパス内にディレクトリを作成する必要があります。

一意のディレクトリを作成したい場合は、一時ファイルを作成し、名前を取得して削除し、同じ名前のディレクトリを作成する必要があるようです。これは非常に面倒です。他のアイデアはありますか?

4

3 に答える 3

9

GetTempPathディレクトリの一意性を確保するために、Guid と連結された戻り値を使用できます。UuidCreateまたはCoCreateGuid Functionを使用して Guid を作成できます。

ディレクトリを再帰的に削除するには、ここに純粋な C の例があります:ディレクトリを再帰的に削除するには? FindFirstFile、FindNextFile、DeleteFile、RemoveDirectoryに基づいています。

SHFileOperationもありますが、より重量があり、Windows シェル関数に基づいています。特にサーバー コードを作成している場合は、シェル DLL が常に必要とは限りません。

于 2011-06-09T04:55:37.473 に答える
4

その下にランダムな名前を付けてGetTempPaththenを使用します。オプションで、既に存在するために失敗した場合は再試行します。しかし、名前の生成が十分に優れていれば、既存の名前と衝突する可能性は、ブラックハットがパスワードや秘密鍵を推測する可能性よりもはるかに小さいため、無視することもできます。CreateDirectoryCreateDirectory

于 2011-06-09T03:09:23.620 に答える
3

を使用して、まだ存在しないファイル名を作成してから、 を使用してディレクトリを作成します。これを行うと、技術的に競合状態が発生します。ファイル名を生成してからディレクトリを作成するまでの間に、別のプロセスがその名前のファイルまたはディレクトリを作成する可能性がありますが、その可能性はかなり低いです。それを防ぐために、成功するまでループすることができます。_tempnam tmpnam_sCreateDirectory

ディレクトリ ツリーを再帰的に削除するには、SHFileOperation. または、FindFirstFile/ FindNextFileDeleteFile、およびRemoveDirectory.

終了時にディレクトリを自動的に削除する場合は、 を使用して関数を登録しますatexit。これは、通常のプログラムの終了 (つまり、関数または/exitからの復帰) でのみ機能します。これは、プログラムの異常終了 (たとえば、アクセス違反、誰かが を呼び出しているなど) に対しては機能しません。mainWinMainabortTerminateProcess

于 2011-06-09T04:42:06.073 に答える