- ベストアンサー
一時ファイルについて win32 GetTempFileName
- 一時ファイルは基本的にプログラム終了時には削除するものだが、万が一、不正な処理によって削除できなかった場合に不要なファイルが残ってもいいようにあるということを学んだのですが、そこでいくつか質問があります。
- 残ってしまった一時ファイルはいつ削除されるのでしょうか?
- GetTempFileNameを使って作成した一時ファイルは、Windows のシャットダウン時に自動的に削除されることはありません。とMSDNに書いてあったのですが、シャットダウン時に自動的に削除される一時ファイルも作ることができるのでしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>残ってしまった一時ファイルはいつ削除されるのでしょうか? 作成した場所にもよりますが…自主的に削除するまで…でしょうか。 環境変数TMPやTEMPで設定されている箇所に作成した場合は、「ディスク・クリーンアップ」で削除されるかと思われます。 >GetTempFileNameを使って作成した一時ファイルは、Windows のシャットダウン時に自動的に削除されることはありません。とMSDNに書いてあったのですが、シャットダウン時に自動的に削除される一時ファイルも作ることができるのでしょうか? シャットダウン時…ではありませんが、CreateFile()の第6引数のファイル属性でFILE_FLAG_DELETE_ON_CLOSEを付けると、使用後に削除してくれる…らしいです。 試したことはありませんが。 MoveFileEx()で第3引数にMOVEFILE_DELAY_UNTIL_REBOOTを付与することで、再起動時に移動(第2引数をNULLにすることで削除)できます。 # デバイスドライバ等やMicrosoft Updateでの更新の適用に再起動を必要とするのはこのため。 # ちなみに、こちらもシャットダウン時ではなくOSの起動処理の途中で処理されます。 >GetTempFileNameを使う理由がわかりません。なぜ、わざわざファイル名を生成してしかも拡張子が .tmp なのでしょうか? 慣例的に一時ファイルの拡張子に.tmpを使用しているから…でしょう。 >普通に一時フォルダーにファイルを作ってはダメなのでしょうか? 別に問題ありませんよ。 >例えば 任意の名前.txt これだと自動で削除されなくなるとか?? 元々、GetTempFileName()を使用しても自動で削除されたりはしません。 あくまでも「一時ファイルのファイル名を(フルパスで)取得する」だけです。 # ある程度ファイル名の形式が指定できたり、「確実に使用中ではないファイル名」を生成できたりするだけです。 # 使用中でない~を確実にするために空ファイルの作成をすることはありますが。(第3引数に0を指定した場合) >そんな重要じゃないけど残ってたらうれしいな程度のファイル(ソフトウェアの前回の状態を記憶したファイルなど)を一時フォルダーに作って保存して置くってのはありなのでしょうか? ありと言えばありですが…いつ削除されるかわかりませんよ。 ということで、「ソフトウェアの前回の状態を記憶したファイルなど」はソフトウェアのインストールされたディレクトリや、それ用のディレクトリに保存します。 # XPなら「Documents and Settings」の下の各アカウントディレクトリの下にある「Application Data」や「Local Settings」の下にディレクトリを作成して入れたり、「My Documents」の下に入れたり… # これらのディレクトリ名もAPIで取得できます。
お礼
丁寧にありがとうございます。 とても勉強になりました!