


























上一篇介绍了VirtualPathProvider中虚拟文件的实现,参考:ASP.NET VirtualPathProvider (上)。
文件系统中,只有文件是不完整的,还要有目录。本篇介绍VirtualPathProvider中的虚拟目录实现。
实现代码:
using System.Collections;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting; namespace Xianfen.Net.MyVirtualPathProvider_Directory
{
public class MyVirtualPathProvider : VirtualPathProvider
{
public static void AppInitialize()
{
HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
} bool IsVirtualFile(string vPath)
{
return Regex.IsMatch(vPath, @".*vfile\d{1}\.aspx", RegexOptions.IgnoreCase);
} bool IsVirtualDirectory(string vPath)
{
string relativePath = VirtualPathUtility.ToAppRelative(vPath); return Regex.IsMatch(relativePath, @"~/vdir\d{1}/.*", RegexOptions.IgnoreCase);
} public override bool FileExists(string virtualPath)
{
if (IsVirtualFile(virtualPath))
{
return true;
}
else
{
return Previous.FileExists(virtualPath);
}
} public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, System.DateTime utcStart)
{
if (IsVirtualFile(virtualPath))
{
return null;
}
else
{
return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
}
} public override bool DirectoryExists(string virtualDir)
{
if (IsVirtualDirectory(virtualDir))
{
return true;
}
else
{
return base.DirectoryExists(virtualDir);
}
} public override VirtualDirectory GetDirectory(string virtualDir)
{
if (IsVirtualDirectory(virtualDir))
{
return new MyVirtualDirectory(virtualDir);
}
else
{
return Previous.GetDirectory(virtualDir);
}
} public override VirtualFile GetFile(string virtualPath)
{
virtualPath = virtualPath.ToLower(); if (IsVirtualFile(virtualPath))
{
return new MyVirtualFile(virtualPath);
}
else
{
return Previous.GetFile(virtualPath);
}
}
}
} namespace Xianfen.Net.MyVirtualPathProvider_Directory
{
public class MyVirtualFile : VirtualFile
{
private string myPath; public MyVirtualFile(string virtualPath)
: base(virtualPath)
{
myPath = virtualPath;
} public override Stream Open()
{
Stream stream = new MemoryStream();
StreamWriter sw = new StreamWriter(stream);
StreamReader sr = null; try
{
string content = File.ReadAllText(HttpContext.Current.Server.MapPath("~/App_Data/htm.txt"), Encoding.UTF8);
content = content.Replace("$currentfile$", myPath);
sw.Write(content);
sw.Flush();
stream.Seek(
dirs.Add(
"vdir1");children.Add(
"vfile1.aspx");files.Add(
"vfile1.aspx");files.Add(
"vfile1.aspx");首先定义了虚拟路径提供者,然后实现了虚拟文件和虚拟目录。值得一提的是,实现虚拟路径时,必须重载VirtualPathProvider的GetCacheDependency方法,可以实现自己的CacheDependency或直接返回null,否则会抛出找不到目录的异常。
运行截图:

此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。