.Net でどのプロセスがファイルをロックしたかを正確に知る方法はありますか?
編集:私は、ユーザーが使用している別のプログラム (Excel など) がファイルを開いているため、ファイルを変更/開くことができないことをユーザーに知らせたいので、これを行っています。うまくいけば、これは役に立ちます。
.Net でどのプロセスがファイルをロックしたかを正確に知る方法はありますか?
編集:私は、ユーザーが使用している別のプログラム (Excel など) がファイルを開いているため、ファイルを変更/開くことができないことをユーザーに知らせたいので、これを行っています。うまくいけば、これは役に立ちます。
これに対する簡単な答えはノーです。
ただし、長い答えは、この情報を見つけるために使用できるさまざまな API 呼び出しと WMI メソッドが存在するということですが、迅速かつ単純であるとは期待しないでください。
API 呼び出しを使用する場合は、SYSTEM_PROCESS_INFORMATION パラメータを指定したNtQuerySystemInformation関数を調べてください。これは、素晴らしい免責事項に付随する素敵な「文書化されていない」方法の1つです。
NtQuerySystemInformation は、Windows の将来のバージョンでは変更されるか、使用できなくなる可能性があります。アプリケーションは、このトピックにリストされている代替機能を使用する必要があります。
したがって、WMI を使用することを優先して、それを避けることをお勧めします。
WMI Win32_Processクラスを使用して、マシンで現在実行されているすべてのプロセスを列挙し、探しているファイルが見つかるまで、各プロセスが保持しているすべてのハンドルを列挙します。残念ながら、「どのプロセスがこのファイルをロックしていますか」という簡単な方法はありません。逆に、目的のファイルをロックしているプロセスが見つかるまでプロセスリストを検索する必要があります。
How To: (Almost) Everything In WMI via C# Part 2: Processesというタイトルの CodeProject に関する素敵な記事をお勧めします。(そういうのが好きな人はパート1もいいです)
ええと...それは正確には.NETの方法ではありません...しかし、簡単なユーティリティを使用して調べたいだけだとしたら、SysInternalsのHandleをチェックしてください。
誰かがこれを理解したようです(そしてあなたもフランス語を学ぶかもしれません:))