如何在ASP.NET中轮询目录?

时间:2012-06-13 10:18:51

标签: c# asp.net

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

有人能告诉我怎么做吗?

感谢。

5 个答案:

答案 0 :(得分:5)

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

问问自己:

  • 什么会引发此轮询?
  • 应用程序如何响应此轮询?

Web应用程序本质上是一个请求/响应系统。因此,任何服务器端逻辑(例如轮询)都应该由请求触发。但是一旦得到回应,民意调查将会变成什么样?假设您在Web应用程序中分叉一个将在后台轮询的线程。它找到什么东西后会怎么做?此时没有请求/响应与之交互。

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

这将更加清晰地区分架构层面的问题。

答案 1 :(得分: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();
}

答案 2 :(得分:1)

首先加载程序后检查目录内容并将其保存为列表。之后添加一个计时器。计时器将检查目录的内容,并将当前内容与上次记录的内容进行比较。比较后,您可以看到目录中更改了哪些文件。

您可以根据需要更改计时器的频率。

希望它有所帮助。

编辑:

调用GetDirectoryContent();在你的程序的onload中。

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

您还可以调整定时器频率。在这个例子中,我只是跟踪文件。因此,只有删除或添加文件时才能学习。如果你想跟踪文件大小,你也可以用同样的方式来做。

答案 3 :(得分:0)

在应用程序启动事件时在global.asax中添加文件监视器。

答案 4 :(得分:0)

目前尚不清楚,您想对这些文件做些什么。如果要读取这些文件并将其缓存以备将来输出,可以在特定目录上使用带有CacheDependency的ASP.NET缓存和一个将重新读取目录并将新文件添加到缓存的回调。您应该查看Cache.Insert方法和CacheDependency constructor