• ベストアンサー

WindowsAPIのCreateFile関数またはDeleteFile関数を利用してのファイル強制削除方法について

別プロセスで握られていているファイルがあります。 通常の削除では削除できない状態です。 同じファイル名で新規ファイルを作成したいのですが、 削除できないため、更新できない状態となっています。 これをWindowsAPIのCreateFile関数またはDeleteFile関数を利用して、 削除&新規ファイル作成したいのですが、どうしたら良いでしょうか。 DeleteFile関数には強制削除パラメータ等がないように見受けられます。 初心者的な質問で申し訳ございませんが、解決方法を教えていただけませんでしょうか。 上記以外の関数で解決できるのであれば、それでも結構ですので、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

 こんばんは。  先ずはファイルを縛りつけているプロセスを停止させる事から着手するしかないのではないでしょうか。  手順として簡単に書くと、大体以下の様になると思います(抜けている部分があるかもしれません)。 (1)ZwQuerySystemInformation()にSystemHandleInformationフラグを与えて、システム上のハンドル情報、SYSTEM_HANDLE_INFORMATION[0~n]をリストアップ。 (2)OpenProcess()にプロセスID(SYSTEM_HANDLE_INFORMATION::ProcessIdメンバ)を渡してプロセスを開く。 (3)ZwDuplicateObject()に(SYSTEM_HANDLE_INFORMATION::Handleメンバ)を渡してハンドルを複製。 (4)ZwQueryObject()でOBJECT_BASIC_INFORMATIONを取る。 (5)ZwQueryObject()でOBJECT_TYPE_INFORMATIONを取り、ハンドルがファイルである事を確認する。 (6)ZwQueryObject()でOBJECT_NAME_INFORMATIONを取り、縛りを解除したいファイル名(フルパス)と比較する。 (7)一致したら、TerminateProcess()でファイルを縛りつけているプロセスを閉じる。 (8)SYSTEM_HANDLE_INFORMATION[0~n]の分だけ、(4)~(7)を繰り返す。 (9)DeleteFile()で消す。  見慣れないフラグや構造体、API名が並んでいますが、これ等はデバイスドライバ開発キットのヘッダファイルで定義されているものが大半です。  其れでも、コンパイルエラーが出る場合には、自前で構造体を書くなり、APIをダイナミックロードして不足分を補います。  要は、とても簡単に出来る事では無いと言う事です。

yasuval
質問者

お礼

詳しく教えていただきありがとうございました。 しかし上記を実装するには少し私の力量では足りない気がします。 ですが、考え方は何となく分かる気がするので、 これを参考に、実装してみたいと思います。 他の皆様も、ありがとうございました。

その他の回答 (2)

回答No.2

> DeleteFile関数には強制削除パラメータ等がないように見受けられます。 プロセスが生きている間にAPIで簡単にファイルを削除できてしまったら、それはそれで問題だと思います。(ファイルロックの意味が・・・) ファイルを削除するにはロックしているプロセスを終了するしかないでしょう。ファイルをロックしているプロセスを調べるソフトはいくつかあります。どのようにプロセスを探しているのかは分かりませんが・・・。

  • med2dic
  • ベストアンサー率77% (21/27)
回答No.1

APIで可能なのかどうかは知りませんが、handle.exeを使えばできると思います。

関連するQ&A