1

ディレクトリをポーリングして、ASP.NET Web アプリケーション (C#) のディレクトリに新しいファイルが追加されているかどうかを確認したいと考えています。新しいファイルが追加されたら、そのファイルを読みたいです。

誰かがそれを行う方法を教えてもらえますか?

ありがとう。

4

5 に答える 5

5

通常はclassを使用FileSystemWatcherます。ただし、別の問題があります。Web アプリケーションは、バックグラウンド プロセスにはあまり適していません。一般に、バックグラウンド タスクとスレッド化を使用することで回避できますが、これはおそらく良い考えではありません。Web アプリケーションはステートレスであり、サーバーによっていつでも再起動できると常に想定してください。

自問してみてください:

  • このポーリングをトリガーするのは何ですか?
  • アプリケーションはこのポーリングにどのように応答しますか?

Web アプリケーションは、基本的に要求/応答システムです。したがって、サーバー側のロジック (ポーリングなど) はすべて、リクエストによってトリガーされる必要があります。しかし、応答が与えられると、ポーリングはどうなるでしょうか? バックグラウンドでポーリングする Web アプリケーションのスレッドをフォークするとします。何かを見つけたとき、それは何をするつもりですか?その時点で、それとやり取りするリクエスト/レスポンスはありません。

このポーリングは、おそらく別のアプリケーションに委任できますか? おそらくWindowsサービスですか?次に、ポーリング中に何かが見つかったことに応じて、Web アプリケーションのデータベース内の値を変更できます。そうすれば、Web アプリケーションへの今後のリクエストで、更新された状態が表示されます。

これにより、アーキテクチャレベルでの懸念がより明確に分離されます。

于 2012-06-13T10:25:34.787 に答える
1

プログラムがロードされた後、最初にディレクトリの内容を確認し、リストとして保持します。その後、タイマーを追加します。タイマーはディレクトリのコンテンツをチェックし、現在のコンテンツを最後にログに記録されたコンテンツと比較します。比較した後、ディレクトリ内で変更されたファイルを確認できます。

必要に応じてタイマーの頻度を変更できます。

それが役に立てば幸い。

編集:

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.
    }
}`

タイマーの周波数を調整することもできます。この例では、ファイルを追跡しているだけなので、ファイルが削除または追加された場合にのみ学習します。ファイルサイズを追跡したい場合は、同じ方法で追跡することもできます。

于 2012-06-13T11:11:22.657 に答える
1

イベント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();
}
于 2012-06-13T10:23:22.417 に答える
0

これらのファイルで何をしたいのか明確ではありません。これらのファイルを読み取って将来の出力のためにキャッシュする場合は、ASP.NET Cache を特定のディレクトリで CacheDependency と共に使用し、ディレクトリを再読み取りして新しいファイルをキャッシュに追加するコールバックを使用できます。Cache.Insertメソッドと CacheDependencyコンストラクターを見てください。

于 2012-06-13T10:41:02.243 に答える
0

アプリケーションの開始イベント時に、global.asmx に Filewatcher を追加します。

于 2012-06-13T10:23:31.127 に答える