dポイントプレゼントキャンペーン実施中!

ファイルを開いたことを検知したいのですが、うまく出来ません。
http://dobon.net/vb/dotnet/file/filesystemwatche …
を参考に若干編集してみたのですが・・・どうしたらうまく検知してくれるのでしょうか?
ファイルが開かれたかどうかは最終アクセス日時の変更があったかどうかで判断します

Dim watcher As New System.IO.FileSystemWatcher

watcher.Path = "C:\My Documents"
watcher.Filter = "*"
watcher.NotifyFilter = System.IO.NotifyFilters.FileName Or _
System.IO.NotifyFilters.DirectoryName Or _
System.IO.NotifyFilters.LastWrite Or _
System.IO.NotifyFilters.LastAccess
watcher.IncludeSubdirectories = False

Dim changedResult As System.IO.WaitForChangedResult = _
watcher.WaitForChanged(System.IO.WatcherChangeTypes.All)
※ファイルを開いてもここから進んでくれない

If changedResult.TimedOut Then
Console.WriteLine("タイムアウトしました。")
Return
End If

Select Case changedResult.ChangeType
Case System.IO.WatcherChangeTypes.Changed
Console.WriteLine(("ファイル 「" + _
changedResult.Name + "」が変更されました。"))
Case System.IO.WatcherChangeTypes.Created
Console.WriteLine(("ファイル 「" + _
changedResult.Name + "」が作成されました。"))
Case System.IO.WatcherChangeTypes.Deleted
Console.WriteLine(("ファイル 「" + _
changedResult.Name + "」が削除されました。"))
Case System.IO.WatcherChangeTypes.Renamed
Console.WriteLine(("ファイル 「" + _
changedResult.OldName + "」の名前が「" + _
changedResult.Name + "」に変更されました。"))
End Select

A 回答 (5件)

>どうもテキストファイルをメモ帳で開いた時はアクセス日時が更新されない事が多いようです。


>エクセルを開いたらうまく行きました。

なるほどお悩みの原因がわかりました。
NTFSのファイルアクセス日時の検知分解能は1時間なんですよ。ですから一度アクセスしたファイルに、1時間以内に複数回アクセスしても、初回しかイベントが発生しません。これは制約事項です。

http://msdn.microsoft.com/ja-jp/library/cc429752 …
このページの「注意」部分の説明を読んでください。
    • good
    • 0
この回答へのお礼

なるほど、そういうことだったのですね。

ありがとうございました。

お礼日時:2008/11/15 14:02

メモ帳などで開いた際に LastAccessTimeが変化しないのは


単に読んでいるだけだからなのかも ・・・

IO.FileStreamなどで ファイルを開いて読むだけの場合
初回はFileSystemWatcherのイベントChangedが発生しますが2回目以降は発生しないようです

Excelなどは WinAPIのSetFileTimeなどでファイルを開いた場合に更新をしているのかもしれません

この回答への補足

なるほど・・そうすると、ファイルが開いたことをFileSystemWatcherでもれなく検知することは不可能ですね。
このほかにファイルが開いたことを検知する方法って何か無いでしょうか?

補足日時:2008/10/26 16:56
    • good
    • 0

お示しのコードで VB2003/2005 + WinXP SP3 の環境で問題なく動作しております


コンソールアプリ or WindowsFormアプリともに動作しております

実行環境は何でしょう?

watcher.WaitForChanged(System.IO.WatcherChangeTypes.All)
のタイプで呼び出した場合 タイムアウトはしないと思いますよ

watcher.WaitForChanged(System.IO.WatcherChangeTypes.All,Wait時間)
のタイプならWait時間を過ぎてもイベントが発生しなかった場合にタイムアウトになるかと ・・・

この回答への補足

ありがとうございます。

環境はVB2005express edition + WindowsXP home edition SP2とVB2008express edition + WindowsXP pro SP2を使用しています。

それぞれステップインで試してみましたが、何れも

Dim changedResult As System.IO.WaitForChangedResult = _
watcher.WaitForChanged(System.IO.WatcherChangeTypes.All)
(※ファイルを開いてもここから進んでくれないと記載のある部分)

ここで止まってしまいます。
即ち、イベントが起きたと認識されていないのです。

・・と、ここまで書いたところで気づいたのですが、ファイルを開いてもアクセス日時が更新されていません・・・。テキストを開いたりプロパティを開いても全く更新されない・・・これが問題みたいですね。
なぜ更新されないのでしょう?

補足日時:2008/10/26 12:57
    • good
    • 0
この回答へのお礼

どうもテキストファイルをメモ帳で開いた時はアクセス日時が更新されない事が多いようです。
エクセルを開いたらうまく行きました。

お礼日時:2008/10/26 13:14

ファイルフォーマットは NTFS でしょうか?

この回答への補足

はい、NTFSです。

補足日時:2008/10/26 12:28
    • good
    • 0

直の回答ではないですが、


参考にされたサイトでは掲示板にて質問等も受け付けてますが。。。

この回答への補足

参考にしたサイト以外では質問禁止なのでしょうか?
普段から教えてgooを使用しており、回答がつくとメールが来る等利点が多い為こちらで質問したまでです。
当然マルチ投稿しているわけではありませんので。

引続き、回答をお待ちしております。

補足日時:2008/10/26 01:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!