

別プロセスで握られていているファイルがあります。
通常の削除では削除できない状態です。
同じファイル名で新規ファイルを作成したいのですが、
削除できないため、更新できない状態となっています。
これを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をダイナミックロードして不足分を補います。
要は、とても簡単に出来る事では無いと言う事です。
詳しく教えていただきありがとうございました。
しかし上記を実装するには少し私の力量では足りない気がします。
ですが、考え方は何となく分かる気がするので、
これを参考に、実装してみたいと思います。
他の皆様も、ありがとうございました。
No.2
- 回答日時:
> DeleteFile関数には強制削除パラメータ等がないように見受けられます。
プロセスが生きている間にAPIで簡単にファイルを削除できてしまったら、それはそれで問題だと思います。(ファイルロックの意味が・・・)
ファイルを削除するにはロックしているプロセスを終了するしかないでしょう。ファイルをロックしているプロセスを調べるソフトはいくつかあります。どのようにプロセスを探しているのかは分かりませんが・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ドライブ・ストレージ Android端末でSDカードが機能しなくなりました 6 2023/02/17 17:20
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/10/03 09:55
- Google Drive Googleドライブで削除できないファイルがある。 5 2023/05/11 09:39
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/10 11:34
- Windows 10 OneDriveアンインストール方法 5 2022/07/19 11:12
- 画像編集・動画編集・音楽編集 動画のトリミング 結合 削除が可能なフリーソフト 2 2022/05/02 22:08
- Windows 95・98 再質問 5 2022/11/29 08:58
- C言語・C++・C# C#の2つの実行ファイルとアプリアイコンの変更について 1 2023/01/07 16:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
Visual C++からpingを実行して...
-
セマフォとmutexの違いは?
-
C#でのbatファイル実行結果取得
-
【C#】別プロセスがロックか...
-
非表示になったエクセルは?
-
別のプロセスの関数を呼び出す...
-
c言語でプロセスIDを調べたい
-
プロセス終了の検知について
-
インスタンスハンドルは何の役...
-
OSPFでプロセスを分ける意義に...
-
タスクマネージャーのプロセス...
-
.NETアプリケーションの戻り値
-
特定ユーザーのプロセス情報を...
-
共有メモリ方式とメッセージパ...
-
WindowsAPIのCreateFile関数ま...
-
IISがフリーズ
-
remove関数(?)でプロセスが停...
-
Windowsのユーザログイン/ログ...
-
他のアプリケーションをクリッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
怪しいプロセス教えてください。
-
sleep関数の精度について
-
【C#】別プロセスがロックか...
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報