1

我想轮询一个目录以检查新文件是否已添加到 ASP.NET Web 应用程序 (C#) 中的目录中。如果添加了任何新文件,我想读取该文件。

谁能给我一个想法如何做到这一点?

谢谢。

4

5 回答 5

5

通常你会使用这个FileSystemWatcher。但是,您还有另一个问题。Web 应用程序并不真正适合后台进程。通常,您可以通过使用后台任务和线程来摆脱它,但这可能不是一个好主意。始终假设您的 Web 应用程序是无状态的,并且可以随时由服务器重新启动。

问你自己:

  • 什么会触发这个投票?
  • 应用程序将如何响应此轮询?

Web 应用程序本质上是一个请求/响应系统。因此,任何服务器端逻辑(例如轮询)都应该由请求触发。但是一旦给出回应,投票会变成什么样子呢?假设您在 Web 应用程序中创建了一个线程,该线程将在后台进行轮询。当它找到东西时会做什么?那时没有请求/响应与之交互。

是否可以将此轮询委托给另一个应用程序?也许是 Windows 服务?然后,为了响应在轮询期间发现的某些内容,它可以修改 Web 应用程序数据库中的值。这样,未来对 Web 应用程序的请求将看到更新的状态。

这将在架构级别上更清晰地分离关注点。

于 2012-06-13T10:25:34.787 回答
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 回答
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 回答
0

不清楚,你想用这些文件做什么。如果您想读取这些文件并缓存它们以供将来输出,您可以使用 ASP.NET 缓存和特定目录上的 CacheDependency 和一个回调,它将重新读取目录并将新文件添加到缓存中。你应该看看Cache.Insert方法和 CacheDependency构造函数

于 2012-06-13T10:41:02.243 回答
0

当应用程序启动事件时,在 global.asmx 中添加 Filewatcher。

于 2012-06-13T10:23:31.127 回答