我想轮询目录以检查是否将新文件添加到ASP.NET Web应用程序(C#)中的目录中。如果添加了任何新文件,我想读取该文件。
有人能告诉我怎么做吗?
感谢。
答案 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