在ASP.NET中使用FileSystemWatcher来监控文件目录

在ASP.NET中我们有时会访问文件,但我们如果不想让代码每次都重新读取文件内容的话,我们可以使用FileSystemWatcher,这在有些情况是是很不错的选择,以下代码演示如何在ASP.NET中使用FileSystemWatcher来监控文件目录,以及在这种监控方式下IIS如何管理Appdomain以及Thread。

首先,我们利用Application_Start事件来在整个Application中创建唯一的FileSystemWatcher实例,并设置关联的监听方法,在监听方法中我们重新读取文件夹信息,并保存在Application变量中。

Global.asax

<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Threading" %>

<script runat="server">
void Application_Start(object sender, EventArgs e)
{
if (Application["FileSystemWatcher"] == null)
{
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher("E:\\Temp", "*.*");
Application["FileSystemWatcher"] = fileSystemWatcher;

fileSystemWatcher.NotifyFilter = NotifyFilters.FileName|NotifyFilters.LastWrite|NotifyFilters.CreationTime;
fileSystemWatcher.Created += fileSystemWatcher_Changed;
fileSystemWatcher.Changed += fileSystemWatcher_Changed;
fileSystemWatcher.Deleted += fileSystemWatcher_Changed;
fileSystemWatcher.Renamed += fileSystemWatcher_Changed;
fileSystemWatcher.EnableRaisingEvents = true;
}
}

void fileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
System.Diagnostics.Debug.WriteLine(string.Format("{0}, D:{1}, T:{2} E:fileSystemWatcher_Changed", DateTime.Now, AppDomain.CurrentDomain.Id, Thread.CurrentThread.ManagedThreadId));

if (Application["EventList"] == null)
{
Application["EventList"] = new List<String>();
}
List<String> eventList = (List<String>)Application["EventList"];
eventList.Add(string.Format("{0}, D:{1}, T:{2} E:fileSystemWatcher_Changed", DateTime.Now, AppDomain.CurrentDomain.Id, Thread.CurrentThread.ManagedThreadId));


Application["FileList"] = Directory.GetFiles("E:\\Temp", "*.*");
}

</script>

其次,我们创建一个页面来显示保存在Application变量中的文件夹等的信息,以验证FileSystemWatcher是否起效。

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
    <div>
    <asp:Label ID="Label1" runat="server" Text="File list:"></asp:Label>
    </div>
    <asp:ListBox ID="lstFile" runat="server" Width="583px">
    </asp:ListBox>
    <br />
    <asp:Label ID="Label2" runat="server" Text="Event list:"></asp:Label>
    <br />
    <asp:ListBox ID="lstEvent" runat="server" Width="579px">
    </asp:ListBox>
</form>
</body>
</html>

Default.aspx.cs

using System;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
lstFile.DataSource = Application["FileList"];
lstFile.DataBind();
lstEvent.DataSource = Application["EventList"];
lstEvent.DataBind();
}
}

 

posted @ 2011-01-05 11:10  昝昝  阅读(2237)  评论(0编辑  收藏  举报