vb6、vb.netで他プロセスが開いているファイルの一覧を取得する方法を教えてください。

サンプルソースもお願いいたします。

回答の条件
  • 1人3回まで
  • 登録:2009/03/12 09:36:58
  • 終了:2009/03/19 09:40:02

回答(1件)

id:fester No.1

fester回答回数124ベストアンサー獲得回数202009/03/12 13:32:36

ポイント60pt

スマートでありませんが、例外を使ってみました


Dim targetFolder As String = "c:\temp"

For Each sourceFile As String In Directory.GetFiles(targetFolder)
    Try
        Using br As New FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.None)
        End Using
    Catch ex As Exception
        Trace.WriteLine(sourceFile)
    End Try
Next

id:neozerocool

すいません。上記のソースでEXCELやWORDが開いているファイルの一覧なども取得できるのでしょうか?

またネットワーク上のファイルを開いている場合も同様でしょうか?

2009/03/12 20:19:45
  • id:fester
    はい。未確認ですが、いけると思います。(無駄に開くのがいただけませんが)
    FileShare.None とするのが味噌で、すでにオープン中のファイルだとこけると思います。
    違っていたらすみません

  • id:neozerocool
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim targetFolder As String = "c:\windows\temp"

    For Each sourceFile As String In IO.Directory.GetFiles(targetFolder)
    Try
    Using br As New System.IO.FileStream(sourceFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None)
    End Using
    Catch ex As Exception
    Trace.WriteLine(sourceFile)
    End Try
    Next

    としてコマンドボタンを配置し
    XPPro32bit + VB.NET 2008 Express Edition の環境で
    EXCEL、WORD系のファイルを開いてみて、コマンドボタ
    ンを押下しためしてみたのですが
    Trace.WriteLine(sourceFile)
    では期待通りのファイル名が取れないようでした。
    何か間違っている部分がありますでしょうか?

    デバックウィンドウにはこんな感じででています。

    'System.IO.IOException' の初回例外が mscorlib.dll で発生しました。
    c:\windows\temp\Perflib_Perfdata_aa4.dat
    'System.IO.IOException' の初回例外が mscorlib.dll で発生しました。
    c:\windows\temp\vmware-serverd.log
    'System.IO.IOException' の初回例外が mscorlib.dll で発生しました。
    c:\windows\temp\vmware-vmount.log

    無知なため十分理解でできてなくてすいません。
  • id:fester
    c:\windows\temp\Perflib_Perfdata_aa4.dat
    c:\windows\temp\vmware-serverd.log
    c:\windows\temp\vmware-vmount.log
    が他のプロセスで掴まれているファイルです。

    エクセル、ワードともに開いていると
    Trace.WriteLine
    によってイミディエイトウィンドウに表示されますよ。


    ん?ん?
    Dim targetFolder As String = "c:\windows\temp" ← ここ
    ここをエクセルとかワードのファイルがあるフォルダにしてますよね?

  • id:neozerocool
    すいません。質問がうまく伝えきれていなかったようです。m(_ _

    http://d.hatena.ne.jp/higepon/20060321/1142909616

    で話がされているような 他のプロセスが任意のパスで開いているファイルの
    情報が知りたいということです。

    パフォーマンスの問題はでると思うのですが誰がどのファイルをつかむかを
    VBでモニタしていたいということでした。





  • id:fester
    それはすみません。

    でしたら、win32api の「NetFileEnum」あたりを使えばできそうです。
    http://www.vbstation.net/spec/S2_8.htm
  • id:neozerocool
    早速の情報ありがとうございます。
    やはり共有しているフォルダでなければ無理そうです。

    XPなどに
    openfiles
    というコマンドがありますが、これと似たことはできると
    思うのですが、やはりWORDやEXCELが任意(ローカル含む)のパスで
    編集しているファイルは取得できないようです。

    今回やりたいことというのは
    たとえばウィルスチェックソフトがウィルスをスキャンしている状態
    (何秒間がかかったとして)の時にも
    VBのプログラム側からみたときに、そのウィルスソフトがつかんだ
    ファイルがどれかということを確認したいということなのです。

    私が勘違いしていましたらすいません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません