我想轮询一个目录以检查新文件是否已添加到 ASP.NET Web 应用程序 (C#) 中的目录中。如果添加了任何新文件,我想读取该文件。
谁能给我一个想法如何做到这一点?
谢谢。
通常你会使用这个FileSystemWatcher
类。但是,您还有另一个问题。Web 应用程序并不真正适合后台进程。通常,您可以通过使用后台任务和线程来摆脱它,但这可能不是一个好主意。始终假设您的 Web 应用程序是无状态的,并且可以随时由服务器重新启动。
问你自己:
Web 应用程序本质上是一个请求/响应系统。因此,任何服务器端逻辑(例如轮询)都应该由请求触发。但是一旦给出回应,投票会变成什么样子呢?假设您在 Web 应用程序中创建了一个线程,该线程将在后台进行轮询。当它找到东西时会做什么?那时没有请求/响应与之交互。
是否可以将此轮询委托给另一个应用程序?也许是 Windows 服务?然后,为了响应在轮询期间发现的某些内容,它可以修改 Web 应用程序数据库中的值。这样,未来对 Web 应用程序的请求将看到更新的状态。
这将在架构级别上更清晰地分离关注点。
您可以在事件中使用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();
}
首先在您的程序加载后检查目录内容并将其保存为列表。然后添加一个计时器。计时器将检查目录的内容并将当前内容与上次记录的内容进行比较。比较之后可以看到目录中有哪些文件被修改了。
您可以根据需要更改计时器的频率。
希望能帮助到你。
编辑:
调用 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.
}
}`
您还可以调整定时器频率。在此示例中,我只是跟踪文件。因此,只有删除或添加文件时,您才能了解。如果您想跟踪文件大小,也可以以相同的方式进行。
不清楚,你想用这些文件做什么。如果您想读取这些文件并缓存它们以供将来输出,您可以使用 ASP.NET 缓存和特定目录上的 CacheDependency 和一个回调,它将重新读取目录并将新文件添加到缓存中。你应该看看Cache.Insert方法和 CacheDependency构造函数
当应用程序启动事件时,在 global.asmx 中添加 Filewatcher。