我在我的 ASP.NET Web 应用程序中使用表单身份验证,并在特定表单中使用 FileSystemWatcher。表单的功能如下。
1. 用户登录应用程序。
2. 应用程序应继续扫描文件夹以查找添加的任何新文件 (XML)。文件夹的路径是从数据库中读取的。
3. 在文件夹中创建新文件时,应用程序从 XML 文件中读取相关数据并在表单中显示有关该文件的信息。
在搜索了实现此功能的相关控件后,我选择了 FileSystemWatcher。我不太确定它在 Web 应用程序中的效果如何。任何人都可以在 ASP.NET Web 应用程序中建议 FileSystemWatcher 的替代品吗?
5 回答
为什么要把事情复杂化?只需存储最后轮询日期,然后获取修改日期大于最后轮询日期的任何文件。FileSystemWatcher 对其使用有许多注意事项,您实际上并不需要它来做您正在做的事情。
使用 DirectoryInfo 和一点 Linq:
public static string[] GetNewFiles(string directory, string searchPattern, DateTime since)
{
// Create a new DirectoryInfo object.
DirectoryInfo dir = new DirectoryInfo(directory);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("The directory does not exist.");
}
// Call the GetFileSystemInfos method.
FileSystemInfo[] infos = dir.GetFileSystemInfos(searchPattern);
string[] newXmlFiles = (from info in infos
where info.CreationTime > since
select info.FullName).ToArray();
return newXmlFiles;
}
public static string[] GetNewOrUpdatedFiles(string directory, string searchPattern, DateTime since)
{
// Create a new DirectoryInfo object.
DirectoryInfo dir = new DirectoryInfo(directory);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("The directory does not exist.");
}
// Call the GetFileSystemInfos method.
FileSystemInfo[] infos = dir.GetFileSystemInfos(searchPattern);
string[] newXmlFiles = (from info in infos
where info.LastWriteTime > since
select info.FullName).ToArray();
return newXmlFiles;
}
public static string[] GetUpdatedFiles(string directory, string searchPattern, DateTime since)
{
// Create a new DirectoryInfo object.
DirectoryInfo dir = new DirectoryInfo(directory);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("The directory does not exist.");
}
// Call the GetFileSystemInfos method.
FileSystemInfo[] infos = dir.GetFileSystemInfos(searchPattern);
string[] newXmlFiles = (from info in infos
where info.LastWriteTime > info.CreationTime && info.LastWriteTime > since
select info.FullName).ToArray();
return newXmlFiles;
}
这FileSystemWatcher
是一个适当的类,但是,从表单中使用它不是正确的方式。相反,尝试在您的 ASP.NET 应用程序(不太理想)或单独的 Windows 服务(更理想)中创建一个后台工作程序,然后您的表单将使用适当的机制与该工作程序通信。然后,工作人员将扫描文件夹并读取数据并准备好供您的表单使用。在ASP.NET 应用程序中的工作线程或 Windows 服务的 WCF 命名管道通道的情况下,该机制可能是一组事件和共享变量。
我不知道 ASP.NET 等效于FileSystemWatcher
.
但是,您可以Begin_Request
向 Global.asax 添加一个事件来检查每个请求的新文件。
如果要创建实时通知,则必须开发两个组件:一个使用 FileSystemWatcher 并从 Web 端检查新事件的服务,相反,您必须使用SignaIR构建实时、多用户交互式 Web 应用程序。
看看这个:
本文展示了如何在 Web 应用程序中使用 FileSystemWatcher,然后继续描述提供 ASP.NET 特定替代方案的缓存机制。