- ベストアンサー
ファイルを検知する方法
- ファイルを検知する方法についての質問です。
- ファイルを開いたことを検知するためには、System.IO.FileSystemWatcherクラスを使用します。
- ファイルの変更、作成、削除、名前の変更などのイベントを監視することができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>どうもテキストファイルをメモ帳で開いた時はアクセス日時が更新されない事が多いようです。 >エクセルを開いたらうまく行きました。 なるほどお悩みの原因がわかりました。 NTFSのファイルアクセス日時の検知分解能は1時間なんですよ。ですから一度アクセスしたファイルに、1時間以内に複数回アクセスしても、初回しかイベントが発生しません。これは制約事項です。 http://msdn.microsoft.com/ja-jp/library/cc429752.aspx このページの「注意」部分の説明を読んでください。
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
メモ帳などで開いた際に LastAccessTimeが変化しないのは 単に読んでいるだけだからなのかも ・・・ IO.FileStreamなどで ファイルを開いて読むだけの場合 初回はFileSystemWatcherのイベントChangedが発生しますが2回目以降は発生しないようです Excelなどは WinAPIのSetFileTimeなどでファイルを開いた場合に更新をしているのかもしれません
補足
なるほど・・そうすると、ファイルが開いたことをFileSystemWatcherでもれなく検知することは不可能ですね。 このほかにファイルが開いたことを検知する方法って何か無いでしょうか?
- redfox63
- ベストアンサー率71% (1325/1856)
お示しのコードで 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) (※ファイルを開いてもここから進んでくれないと記載のある部分) ここで止まってしまいます。 即ち、イベントが起きたと認識されていないのです。 ・・と、ここまで書いたところで気づいたのですが、ファイルを開いてもアクセス日時が更新されていません・・・。テキストを開いたりプロパティを開いても全く更新されない・・・これが問題みたいですね。 なぜ更新されないのでしょう?
ファイルフォーマットは NTFS でしょうか?
補足
はい、NTFSです。
- n-jun
- ベストアンサー率33% (959/2873)
直の回答ではないですが、 参考にされたサイトでは掲示板にて質問等も受け付けてますが。。。
補足
参考にしたサイト以外では質問禁止なのでしょうか? 普段から教えてgooを使用しており、回答がつくとメールが来る等利点が多い為こちらで質問したまでです。 当然マルチ投稿しているわけではありませんので。 引続き、回答をお待ちしております。
お礼
なるほど、そういうことだったのですね。 ありがとうございました。