2010-12-01 4 views
2

テストとシミュレーションのために、私のプロセスで現在開いているファイルを削除したいと思います。Windowsでプロセスによって開かれたファイルを削除することはできますか?

CreateFile docsは、オープンハンドルが指しているファイルを別の操作で削除できるモード(FILE_SHARE_DELETE)でファイルを開くことができると述べています。 (そして私はすでにCreateFile(FILE_SHARE_DELETE)+ DeleteFileでこれを試して確認しました)

私が今知りたいのは、上記のフラグがない人が開いているファイル何とか削除されますか?

私の知る限りとして、DeleteFile docsが、それはこの機能では可能ではないであろう理解し

アプリケーションは、通常のI/O用として、または 開いているファイルを削除しようとした場合DeleteFileをする関数は失敗メモリマップされたファイル

FILE_SHARE_DELETEフラグが設定されていないファイルを削除する方法はありますか?

+0

状況によっては名前を変更することができます。これは、アップグレード/交換したい場合に便利です – valdo

答えて

4

これを行う方法はありません。

このような何かを行うに最も近い方法はNULL、およびdwFlagsパラメータでMOVEFILE_DELAY_UNTIL_REBOOTのターゲット・ファイル名でMoveFileExを使用して再起動時に削除スケジュールを設定することです。

2

このようなファイルを削除する正当な方法はないと思います。しかし、あなたが弾丸になりたい場合は、外部からハンドルを閉じることができるツールがあることに気をつけてから、ファイルを簡単に削除することができます(Process Explorerはそのようなツールの1つですが、othersがあります)。開いたファイルのハンドルを誰かが閉じると、そのハンドルを使用しようとしてエラーが発生します。

+2

ハンドル値はリサイクルできるので、これを行うと非常に奇妙なことが起こることがあります(少なくとも理論的には)。プロダクションコードの一部ではなく、何かをトラブルシューティングする際に最後の手段として使用してください。 –

+0

@Leo Davidson - はい、私は知っています...それについてのRaymond Chenの投稿を見つけようとしましたが、見つけられなかったので、このメモを残しました。万が一それをお読みになりましたか?将来の参照のために、リンクを追加するのが大好きです。 – eran

+0

私は同じ記事を考えていたが、私はそれも見つけられなかった。 :( –

0

あなたはDeleteFileTransactedを見ることができます。これを閉じると、削除のためにファイルをマークすることができます。しかし、すぐにファイルを削除したい場合は、あなたに合っていません。ファイルにFILE_SHARE_DELETEフラグがない場合は、最初にそれを閉じる必要がありますが、この目的のためにファイルハンドルを取得して閉じなければなりません。しかし、これはコードインジェクション技術を使用しています。どのようにして簡単にできるのか分かりません。

+1

前と同じ問題だと思います。「アプリケーションが通常のI/Oまたはメモリマップファイル用に開いているファイルを削除しようとすると、DeleteFileTransacted関数が失敗します。 – Roddy