DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33376 / inTopicNo.1)  ネットワーク越しのFileSystemWatcher
  
□投稿者/ トミー 一般人(3回)-(2016/05/22(Sun) 22:46:58)
  • アイコン環境/言語:[Win8.1+VB2013] 
    分類:[.NET] 

    2016/05/22(Sun) 23:26:22 編集(投稿者)

    ネットワーク先のディレクトリを監視しようとしましたが、IPアドレスパス・ネットワーク割り当てでも監視されません。array(1) = "C:\HDD"ではうまく監視できています。



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Dim watcher As New System.IO.FileSystemWatcher

    Dim array(1) As String
    Dim intArray As Integer

    'フォームのレイアウトロジックを中断する
    Me.SuspendLayout()

    'array(0) = "N:\TEST\001"
    array(0) = "\\192.168.11.1\TEST\001"
    array(1) = "C:\HDD"
    'フォームのレイアウトロジックを再開する
    Me.ResumeLayout(False)
    mfswBill = New System.IO.FileSystemWatcher(UBound(array)) {}

    For intArray = 0 To UBound(array)
    mfswBill(intArray) = New System.IO.FileSystemWatcher
    With mfswBill(intArray)
    .Path = array(intArray)
    'すべてのファイルを監視
    .Filter = "*.*"
    'イベントハンドラの追加
    AddHandler mfswBill(intArray).Created, AddressOf watcher_Changed
    'サブディレクトリも監視できるようにする
    .IncludeSubdirectories = True
    '監視を開始する
    .EnableRaisingEvents = True
    End With
    Next
    End Sub
    Private Sub watcher_Changed()
    MsgBox("追加されました")
    End Sub

    どうソースを直したらネットワーク越しのディレクトリを監視できるようにできるか教えてください。
引用返信 削除キー/
■33377 / inTopicNo.2)  Re[1]: ネットワーク越しのFileSystemWatcher
□投稿者/ 魔界の仮面弁士 大御所(1030回)-(2016/05/23(Mon) 10:47:53)
  • アイコンNo33376に返信(トミーさんの記事)
    > どうソースを直したらネットワーク越しのディレクトリを監視できるようにできるか教えてください。

    手元の Windows Server 2012 を相手にテストしたところ、動作しました。
    (実環境に合わせて、パスと権限設定は調整しましたけれども)

    FileSystemWatcher クラスは、ReadDirectoryChangesW API のラッパーですが、
    相手のサーバーが、変更通知をサポートしているかどうかを確認しておいてください。
    たとえば Mac や Win2000 の共有フォルダなどは、変更通知をサポートしていないようです。
    https://support.microsoft.com/ja-jp/kb/436522
    http://d.hatena.ne.jp/seraphy/20120506


    > AddHandler mfswBill(intArray).Created, AddressOf watcher_Changed
    Changed イベントではなく
    Created イベントなのに、
    Changed という名前で受け取るのですか? (^^;


    > Private Sub watcher_Changed()
    Created イベントのシグネチャは、本来は Sub() ではなく、
    Sub(Object, FileSystemEventArgs) ですね。

    まぁ、Option Strict Off の場合は Sub() でも通りますけれども。


    > Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    64bit OS で開発している場合、Load イベントを使っていると、
    デバッグ時の例外を取りこぼしやすいので御注意ください。

    x86 ビルドにするか、あるいは Shown イベントで代用することで対処できます。
    http://rucio.cocolog-nifty.com/blog/2011/04/post-f125.html


    > .Path = array(intArray)
    ここで認証エラーが発生していませんか?

    FileSystemWatcher は、既定では LocalSystem アカウントで認証されますので、
    ネットワーク設定次第では権限不足で失敗します。

    あらかじめ共有アクセス権を持つユーザーとしてサービスを実行しておくか、
    あるいは FileSystemWatcher を割り当てる直前に、WNetAddConnection2W API
    ないしは NET USE コマンド等でネットワーク接続を確立しておく必要があります。
引用返信 削除キー/
■33378 / inTopicNo.3)  Re[2]: ネットワーク越しのFileSystemWatcher
□投稿者/ トミー 一般人(4回)-(2016/05/23(Mon) 12:42:14)
  • アイコン質問したのは自宅pcからなので、
    今回はスマホからごめんなさい。


    >
    >>AddHandler mfswBill(intArray).Created, AddressOf watcher_Changed
    > Changed イベントではなく
    > Created イベントなのに、
    > Changed という名前で受け取るのですか? (^^;
    >
    いい加減なコーティングでした。帰宅してから直します。


    このプログラムの作成理由を正直にいいますと、
    自宅のエプソン複合機にセットしてるSDカードの中身を監視しようと考えてます。
    複合機でスキャンすると、ファイルの作成日時・更新日時が2012/01/01で固定されてしまうので、監視ソフトでファイル作成と同時に作成日時更新日時を変えようと考えてます(今回投稿したソースではまだ作成日時を変えるロジックはまだ搭載してません)。

    前置きが長くなりましたが、sdカードであるとそもそもハードウェア・ネットワーク要件が合わないのでしょうか…

    仕事終えてから、自宅にもどり開発が出来る状態で詳しく現状を記載します。

    貴重な時間ご回答ありがとうございます。

引用返信 削除キー/
■33379 / inTopicNo.4)  Re[3]: ネットワーク越しのFileSystemWatcher
□投稿者/ Azulean 大御所(467回)-(2016/05/23(Mon) 22:20:18)
  • アイコンNo33378に返信(トミーさんの記事)
    > 自宅のエプソン複合機にセットしてるSDカードの中身を監視しようと考えてます。
    > 複合機でスキャンすると、ファイルの作成日時・更新日時が2012/01/01で固定されてしまうので、監視ソフトでファイル作成と同時に作成日時更新日時を変えようと考えてます(今回投稿したソースではまだ作成日時を変えるロジックはまだ搭載してません)。
    >

    SD カードといったメディア媒体というよりは、その「ファイル共有」のサービスを提供する、複合機のソフトウェア(サーバー)次第です。
    Windows に対して変更を通知するような設計・実装になっていなければ、変更を検知することはできないと思われます。
引用返信 削除キー/
■33380 / inTopicNo.5)  Re[4]: ネットワーク越しのFileSystemWatcher
□投稿者/ トミー 一般人(5回)-(2016/05/24(Tue) 00:01:48)
  • アイコンこんばんは、ご回答ありがとうございます。


    Private mfswBill() As System.IO.FileSystemWatcher = Nothing


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Dim watcher As New System.IO.FileSystemWatcher

    Dim array(1) As String
    Dim intArray As Integer

    'フォームのレイアウトロジックを中断する
    Me.SuspendLayout()

    'array(0) = "N:\TEST\001"
    array(0) = "\\192.168.11.1\TEST\001"
    array(1) = "C:\HDD"
    'フォームのレイアウトロジックを再開する
    Me.ResumeLayout(False)
    mfswBill = New System.IO.FileSystemWatcher(UBound(array)) {}

    For intArray = 0 To UBound(array)
    mfswBill(intArray) = New System.IO.FileSystemWatcher
    With mfswBill(intArray)
    .Path = array(intArray)
    'すべてのファイルを監視
    .Filter = "*.*"
    'イベントハンドラの追加
    AddHandler mfswBill(intArray).Created, AddressOf watcher_Created
    'サブディレクトリも監視できるようにする
    .IncludeSubdirectories = True
    '監視を開始する
    .EnableRaisingEvents = True
    End With
    Next
    End Sub
    Private Sub watcher_Created()
    MsgBox("追加されました")
    End Sub



    と変更しましたが

    >相手のサーバーが、変更通知をサポートしているかどうかを確認しておいてください。

    >SD カードといったメディア媒体というよりは、その「ファイル共有」のサービスを提供する、複合機のソフトウェア(サーバー)次第です。
    Windows に対して変更を通知するような設計・実装になっていなければ、変更を検知することはできないと思われます。

    説明書など見ましたが変更が検知するかどうかが調べれませんでした。

    >64bit OS で開発している場合、Load イベントを使っていると、
    >デバッグ時の例外を取りこぼしやすいので御注意ください。

    >x86 ビルドにするか、あるいは Shown イベントで代用することで対処できます。

    x86 ビルド、Shown でも例外が取れなかったですね。


    ただ、
    http://rucio.cocolog-nifty.com/blog/2011/04/post-f125.html
    ではLoad 、 shownでもエラーになりました。


    >> .Path = array(intArray)
    >ここで認証エラーが発生していませんか?

    してないですね・・・

    > NET USE コマンド等でネットワーク接続を確立しておく必要があります。

    確立させましたがダメでした・・・。



    やはり監視ができないんでしょうか・・・?
引用返信 削除キー/
■33381 / inTopicNo.6)  Re[5]: ネットワーク越しのFileSystemWatcher
□投稿者/ Azulean 大御所(468回)-(2016/05/24(Tue) 22:25:22)
  • アイコンNo33380に返信(トミーさんの記事)
    > 説明書など見ましたが変更が検知するかどうかが調べれませんでした。

    一般向けの説明書と考えれば、そういったことは書かないと思います。
    メーカーのサポートから聞き出せるかどうか…。


    > やはり監視ができないんでしょうか・・・?

    わかりません。
    現物を持っていないので、できること・できないことのどちらの立場もとれないのが実情です。

    エクスプローラーでそのフォルダーを開いたまま、ファイルが増えてもエクスプローラーも検知しないというのであれば、まず無理だと思われます。

    自動検知が無理なら、あとは定期的にポーリングするしかなさそうです。
    (数秒ごとにファイル一覧を読み込んでみて差分がないかを確認する)

引用返信 削除キー/
■33382 / inTopicNo.7)  Re[6]: ネットワーク越しのFileSystemWatcher
□投稿者/ トミー 一般人(6回)-(2016/05/25(Wed) 07:09:47)
  • アイコンAzulean様

    >
    > エクスプローラーでそのフォルダーを開いたまま、ファイルが増えてもエクスプローラーも検知しないというのであれば、まず無理だと思われます。
    >
    > 自動検知が無理なら、あとは定期的にポーリングするしかなさそうです。
    > (数秒ごとにファイル一覧を読み込んでみて差分がないかを確認する)
    >

    ローカル端末からネットワーク端末の対象のディレクトリに対してファイル数をカウントするexeをタスクスケジューラで起動するとかですかね・・・

    >>ファイルの作成日時・更新日時が2012/01/01で固定されてしまうので、監視ソフトでファイル作成と同時に作成日時更新日時を変えようと考えてます

    (秒・分単位の)厳密な時間にはこだわって無いので、ディレクトリ(最下層まで)のファイルで作成日時を2012/01/01のものをタイプスタンプを起動時の時刻に変更する・・・でもいいと思っています。
引用返信 削除キー/
■33391 / inTopicNo.8)  暫定措置にしました。
□投稿者/ トミー 一般人(7回)-(2016/06/10(Fri) 06:56:26)
  • アイコン回答遅くなりごめんなさい。
    >ディレクトリ(最下層まで)のファイルで作成日時を2012/01/01のものをタイプスタンプを起動時の時刻に変更する・・・でもいいと思っています。

    にしました。
    それをタスクスケジューラで実行することにしました。


    質問に回答いただいた方、本当にありがとうございました。


解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -