ディレクトリをポーリングして、ASP.NET Web アプリケーション (C#) のディレクトリに新しいファイルが追加されているかどうかを確認したいと考えています。新しいファイルが追加されたら、そのファイルを読みたいです。
誰かがそれを行う方法を教えてもらえますか?
ありがとう。
通常はclassを使用しFileSystemWatcher
ます。ただし、別の問題があります。Web アプリケーションは、バックグラウンド プロセスにはあまり適していません。一般に、バックグラウンド タスクとスレッド化を使用することで回避できますが、これはおそらく良い考えではありません。Web アプリケーションはステートレスであり、サーバーによっていつでも再起動できると常に想定してください。
自問してみてください:
Web アプリケーションは、基本的に要求/応答システムです。したがって、サーバー側のロジック (ポーリングなど) はすべて、リクエストによってトリガーされる必要があります。しかし、応答が与えられると、ポーリングはどうなるでしょうか? バックグラウンドでポーリングする Web アプリケーションのスレッドをフォークするとします。何かを見つけたとき、それは何をするつもりですか?その時点で、それとやり取りするリクエスト/レスポンスはありません。
このポーリングは、おそらく別のアプリケーションに委任できますか? おそらくWindowsサービスですか?次に、ポーリング中に何かが見つかったことに応じて、Web アプリケーションのデータベース内の値を変更できます。そうすれば、Web アプリケーションへの今後のリクエストで、更新された状態が表示されます。
これにより、アーキテクチャレベルでの懸念がより明確に分離されます。
プログラムがロードされた後、最初にディレクトリの内容を確認し、リストとして保持します。その後、タイマーを追加します。タイマーはディレクトリのコンテンツをチェックし、現在のコンテンツを最後にログに記録されたコンテンツと比較します。比較した後、ディレクトリ内で変更されたファイルを確認できます。
必要に応じてタイマーの頻度を変更できます。
それが役に立てば幸い。
編集:
GetDirectoryContent();を呼び出します。プログラムのオンロードで。
FileInfo[] lastUpdatedFies;
FileInfo[] temporaryFiles;
private void GetDirectoryContent()
{
DirectoryInfo di = new DirectoryInfo("c:/mydirectorypath/");
lastUpdatedFies = di.GetFiles(".");
}
private void GetDirectoryContent()
{
DirectoryInfo di = new DirectoryInfo("c:/mydirectorypath/");
lastUpdatedFies = di.GetFiles("*.*");
}
protected void tmrDirectory_Tick(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo("c:/mydirectorypath/");
temporaryFiles = di.GetFiles("*.*");
foreach (FileInfo f in lastUpdatedFies)
{
//compare the list of files and do whatever you want.
// you can track any kind of data this way.
}
}`
タイマーの周波数を調整することもできます。この例では、ファイルを追跡しているだけなので、ファイルが削除または追加された場合にのみ学習します。ファイルサイズを追跡したい場合は、同じ方法で追跡することもできます。
イベントFileSystemWatcher
でインスタンスを使用および作成できます。Application_Start
サンプルコード:
protected void Application_Start(
Object sender, EventArgs e)
{
FileSystemWatcher fsw =
new FileSystemWatcher(
Server.MapPath( “.” ) );
Application.Add( “myfsw” , fsw );
// Add event handlers here
fsw.EnableRaisingEvents = true;
}
申請が終了したら廃棄してください。
protected void Application_End(
Object sender, EventArgs e)
{
FileSystemWatcher fsw =
(FileSystemWatcher
)Application[“myfsw”];
Application.Remove( “myfsw” );
fsw.Dispose();
}
これらのファイルで何をしたいのか明確ではありません。これらのファイルを読み取って将来の出力のためにキャッシュする場合は、ASP.NET Cache を特定のディレクトリで CacheDependency と共に使用し、ディレクトリを再読み取りして新しいファイルをキャッシュに追加するコールバックを使用できます。Cache.Insertメソッドと CacheDependencyコンストラクターを見てください。
アプリケーションの開始イベント時に、global.asmx に Filewatcher を追加します。