2016-11-21 9 views
0

C#のFileSystemWatcherに問題があります。 他のプログラムで使用されているファイルを見ています。 これは問題ではありません。問題は、ファイルによって変更される唯一の値がサイズであることです。他のプログラムは、変更または書き込み日を更新せずにファイルを書き込んでいます。 サイズの値は、(ウィンドウ7)エクスプローラがリフレッシュ(F5、またはファイルをクリック)したときにのみ更新されます。C#FileSystemWatcherのファイルサイズはWindowsエクスプローラでのみ更新されます

FileSystemWatcher fileWatcher = new FileSystemWatcher(); 
fileWatcher.Changed += new FileSystemEventHandler(fileWatcher_Changed); 
fileWatcher.Path = Path.GetDirectoryName(path); // get directory of file path. 
fileWatcher.Filter = Path.GetFileName(path); // only this file 
fileWatcher.NotifyFilter = NotifyFilter.Size; // and maybe other 
fileWatcher.EnableRaisingEvents = true; 

private void fileWatcher_Changed(object sender, FileSystemEventArgs e) 
{ 
    // ... 
} 

私はこの問題がポーリングによってのみ解決できると思います。ファイル情報データを更新するためにファイルをトリガする必要があるためです。 しかし、私はポーリングなしで別の解決策を望んでいます。

アプリケーションについて: 別のプログラムを使用しているファイルを読み込んでいます。 FileStream FileShare.ReadWriteを使用すると、ファイルのテキストを取得することができます。それは正常に動作しています。ファイルが変更されたときに、テキストボックスを更新したい(ファイルを読む)。しかし、他のプログラムがアクセスしている間に更新している唯一の値は、ファイルサイズです。しかし、エクスプローラがリフレッシュしている場合、またはファイルをクリックしている場合に限ります。これがこの問題の問題です。問題が解決できない場合、別の方法は、ファイル内容(ファイルの読み取り)をx回更新することです。ファイルウォッチャーを使用せずに(ポーリング)実行できます。

+0

"そして、(Windows 7)エクスプローラがリフレッシュ(F5、またはファイルをクリック)したときにのみサイズ値が更新されます。 - 'fileWatcher.Changed'イベントは、ファイルを含むディレクトリに開いている既に開いているWindowsエクスプローラウィンドウをリフレッシュするときだけ起動すると言っていますか? – Quantic

+0

はい、Windowsエクスプローラが開いていて、F5キーを押すか、ファイルをクリックしたときのみです。私は、FileSystemWatcherはprevをチェックしていると思います。実際の値です。デフォルトでは、サイズ値自体は更新されません。おそらくそれはシステムの多くの資源を必要とするでしょう。しかし、エクスプローラがディレクトリを開くために使用している場合、またはF5キーでリフレッシュするか、ファイルをクリックしている場合のみです。しかし、サイズは変化しています。ファイルのプロパティに表示されます。 – Dominik

+0

私はWindowsエクスプローラのサイズを参照して、私は他のプログラマがそれをwrtingしていると確信しています。私はFileInfoオブジェクトがありません。私のアプリケーションは、変更時にこのファイルを読み込むためのものです(変更日時が更新されていないためサイズが変更されました)。 FileStream FileShare.ReadWriteで可能です。これにより、別のプログラムで使用されているファイルを読み取ることができます。唯一の問題は、サイズ情報(エクスプローラで更新している唯一の値)がWindowsエクスプローラなしで更新されていないことです。私は周期的にトリガーする必要があるように見えます。しかし、私は何もサイクリック(ポーリング)を望んでいない、ちょうどファイル変更イベントです。 – Dominik

答えて

0

恐らく、以下のことがあなたの問題を解決し、ポーリングを避けるでしょう。 C#のからではなく、それらの線に沿って適用された場合

select filesize from 'cim_datafile' where name='_your_path_'

多少異なる場合があります:のようなもので名前空間はのroot \ CIMV2を照会、WMIを使用してみてください。 WMIに関しては、.NETでWMIリスナを初期化する方法についてのチュートリアルがたくさんあります。周囲を検索します。

関連する問題