DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ファイルが開いているかの確認チェック

分類:[.NET]

はじめまして。
いろいろ調べましたがわからず、皆様のお力をお借りしたく質問させていただきます。

Aというエクセルファイルがあります

このAというファイルの存在確認をするのですが、
存在した場合、このAが開いているか(タスクバー上にあるか)確認したいのです。

何か良い方法がございましたらよろしくお願いします。
あまり良い方法ではないですけど...

Dim FileWritable As Boolean
Dim fs As System.IO.FileStream
Dim fileName As String = "C:\Test.xls"

If System.IO.File.Exists(fileName) Then
MessageBox.Show("'" + fileName + "'は存在します。")

Try
fs = System.IO.File.OpenWrite(fileName)
FileWritable = True
MessageBox.Show("'" + fileName + "'は書き込み可能です。")

Catch ex As Exception

FileWritable = False
MessageBox.Show("'" + fileName + "'は書き込み不可能です。" _
+ ControlChars.CrLf + ex.ToString)
Finally
If FileWritable = True Then
fs.Close()
End If
End Try

Else
MessageBox.Show("'" + fileName + "'は存在しません。")
End If


実際にファイルをOpenしなくても、調べる方法があれば私も知りたいです。
こんにちは、じゃんぬ です。

■No10458に返信(ポンさんの記事)
> 実際にファイルをOpenしなくても、調べる方法があれば私も知りたいです。

というより、ロックされているのとファイルが開かれているのとでは、別じゃないですか?
質問者さんの「開いているか」が「開けられるか」だったら話は別ですが。
じゃんぬさん、こんにちは

> というより、ロックされているのとファイルが開かれているのとでは、別じゃないですか?

じゃんぬさんの仰るとおり、質問は、「開いているか(タスクバー上にあるか)確認したい」とのことなので、
ちょっと違っていました。ごめんなさい。
上記のコードでは、Excelのファイルが読み取り専用で開かれていた場合には、正しく判定できませんね。
■No10460に返信(ポンさんの記事)
> じゃんぬさんの仰るとおり、質問は、「開いているか(タスクバー上にあるか)確認したい」とのことなので、
> ちょっと違っていました。ごめんなさい。
> 上記のコードでは、Excelのファイルが読み取り専用で開かれていた場合には、正しく判定できませんね。

ファイル名だけであれば、判断する方法はあるんですが、その特定のファイルのパス指定となると難しいですね。
(多分ムリだと思います。)

VBAでの判定もファイル名ですし。
あおしまさんの質問の意図が、ファイル名なのかそのファイルまでのパスなのかが、今ひとつわからないので何とも。
「いろいろ調べました」というのは、何をどのように調べたのか疑問ではありますけど、それはさておき。


 最初に確認させてください。
 『開いている=タスクバー上にある』とは限りませんが、それはよろしいのでしょうか? 私に思いつくものだけでも次のような状況があります。

 A. ファイルを開いたままユーザーの切り替えを行っている
 B. 対象ファイルが共有ファイルで、別PCから開いている
 C. プログラムから非表示で開いている


 こういったものを考慮する必要がないのであれば、次のやり取りが参考になるかと思います。 Excel を複数起動していても、全てのワークブックを取得することが可能です。
#恐らく状況 C についてもクリアできるでしょう。

ファイル名の取得
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=18667

#その昔未実質解決に終ったスレッド『複数起動のExcel.Applicationの取得』 ( http://dobon.net/vb/bbs/log3-10/5405.html ) も、この内容で解決できますね。


(余談)
 状況 B についても次の方法を用いれば対処できるかも知れません。

共有ファイルを現在使用しているユーザーを特定する方法
http://www.atmarkit.co.jp/fwin2k/win2ktips/083opened_net_file/083opened_net_file.html
■No10307に返信(あおしまさんの記事)
> 何か良い方法がございましたらよろしくお願いします。

  せっかく、どぼんさんのサイトに来たのなら・・・

  http://dobon.net/vb/dotnet/file/filesystemwatcher.html

  ファイルの監視では、ダメなのでしょうか?

  ある一瞬の時点で、該当するファイルが開かれているかどうかは、
  WindowsのOSの仕様では、厳密に知ることはできません。

  フィルタードライバーとかで、ファイルのオープン・クローズを
  監視させるようなデバイスドライバーレベルのものが無いと完全
  にはできません。

  ですが、開かれた瞬間とかを、イベントとして知る方法はありま
  す。

  ご検討下さい。

以上。
■No10483に返信(岡田 之仁さんの記事)
>   せっかく、どぼんさんのサイトに来たのなら・・・
>
>   http://dobon.net/vb/dotnet/file/filesystemwatcher.html
>
>   ファイルの監視では、ダメなのでしょうか?

要件を聞く限りは、ダメでしょう。
いろいろな方法があって面白いですね。質問者の方が沈黙されているので、難しいところですが。

私も一つそれっぽい方法を紹介します。次のような投稿がニュースグループにあります。

Open files and locks
http://www.dotnet247.com/247reference/msgs/41/206104.aspx

参考になればよいのですが。
こんにちは、にゃおと申します。

■No10307に返信(あおしまさんの記事)
> このAというファイルの存在確認をするのですが、
> 存在した場合、このAが開いているか(タスクバー上にあるか)確認したいのです。

エクセルを開いていると普通はタスクバー上にあるハズなので、
エクセルのウィンドウを検索するのはどうでしょうか?
でも、タイトルを変更してる場合は特定するのは難しいですが。

DOBON.NET | プログラミング道 | プログラミング掲示板