
ファイルを開いたことを検知したいのですが、うまく出来ません。
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
No.5ベストアンサー
- 回答日時:
>どうもテキストファイルをメモ帳で開いた時はアクセス日時が更新されない事が多いようです。
>エクセルを開いたらうまく行きました。
なるほどお悩みの原因がわかりました。
NTFSのファイルアクセス日時の検知分解能は1時間なんですよ。ですから一度アクセスしたファイルに、1時間以内に複数回アクセスしても、初回しかイベントが発生しません。これは制約事項です。
http://msdn.microsoft.com/ja-jp/library/cc429752 …
このページの「注意」部分の説明を読んでください。
No.4
- 回答日時:
メモ帳などで開いた際に LastAccessTimeが変化しないのは
単に読んでいるだけだからなのかも ・・・
IO.FileStreamなどで ファイルを開いて読むだけの場合
初回はFileSystemWatcherのイベントChangedが発生しますが2回目以降は発生しないようです
Excelなどは WinAPIのSetFileTimeなどでファイルを開いた場合に更新をしているのかもしれません
この回答への補足
なるほど・・そうすると、ファイルが開いたことをFileSystemWatcherでもれなく検知することは不可能ですね。
このほかにファイルが開いたことを検知する方法って何か無いでしょうか?
No.3
- 回答日時:
お示しのコードで 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)
(※ファイルを開いてもここから進んでくれないと記載のある部分)
ここで止まってしまいます。
即ち、イベントが起きたと認識されていないのです。
・・と、ここまで書いたところで気づいたのですが、ファイルを開いてもアクセス日時が更新されていません・・・。テキストを開いたりプロパティを開いても全く更新されない・・・これが問題みたいですね。
なぜ更新されないのでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
Batch: フォルダ内の特定のファ...
-
共有フォルダに誰が何にアクセ...
-
社内Excel共有ブックでの保存ト...
-
ファイルの途中に文字列を挿入
-
特定のエクセルファイルを起動...
-
(Excelマクロ)datファイルをエ...
-
AccessVBAで作成したExcelファ...
-
HTMLとデータベースの連携
-
【VBA】異なる行だけを抜き出す...
-
Excel同士のデータの突合
-
tmpファイル なぜできる?削除...
-
httpの画像urlが作りたいんです...
-
ファイルメーカー7.03でスクリ...
-
拡張子が「cda」のファイルを聞...
-
【ExcelVBA】FreeFile関数とGet...
-
大量のCSVデータを行列の変換を...
-
【アクセス】「ほかのユーザー...
-
AccessにリンクさせたExcelファ...
-
XMLデータを変換し印刷する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【Excel】[Expression.Error] ...
-
特定のエクセルファイルを起動...
-
Batch: フォルダ内の特定のファ...
-
共有フォルダに誰が何にアクセ...
-
excelを共有ファイルにすると行...
-
社内Excel共有ブックでの保存ト...
-
AccessVBAで作成したExcelファ...
-
事務の派遣で働いています。多...
-
VBAでCSVファイルが使用中かど...
-
拡張子が「cda」のファイルを聞...
-
Access VBA を利用して、フォル...
-
(Excelマクロ)datファイルをエ...
-
【VBA】異なる行だけを抜き出す...
-
【アクセス】「ほかのユーザー...
-
Excel VBA 処理後データが重た...
-
相手のPCにVBAからメッセ...
-
access関数を説明できる方いま...
-
XMLデータを変換し印刷する方法
-
WEBクエリが使えない場合のHPデ...
-
メールで送られてきたワードの...
おすすめ情報