惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
C
Cisco Blogs
Help Net Security
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Scott Helme
Scott Helme
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
L
LINUX DO - 热门话题
I
InfoQ
GbyAI
GbyAI
NISL@THU
NISL@THU
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Engineering at Meta
Engineering at Meta
H
Hackread – Cybersecurity News, Data Breaches, AI and More
TaoSecurity Blog
TaoSecurity Blog
Simon Willison's Weblog
Simon Willison's Weblog
A
About on SuperTechFans
Spread Privacy
Spread Privacy
月光博客
月光博客
W
WeLiveSecurity
AWS News Blog
AWS News Blog
云风的 BLOG
云风的 BLOG
有赞技术团队
有赞技术团队
Security Latest
Security Latest
人人都是产品经理
人人都是产品经理
PCI Perspectives
PCI Perspectives
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
T
Troy Hunt's Blog
Martin Fowler
Martin Fowler
The Hacker News
The Hacker News
T
Tor Project blog
C
CERT Recently Published Vulnerability Notes
Apple Machine Learning Research
Apple Machine Learning Research
Stack Overflow Blog
Stack Overflow Blog
K
Kaspersky official blog
Cloudbric
Cloudbric
H
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
D
DataBreaches.Net
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Tenable Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - Franky
L
LINUX DO - 最新话题
MyScale Blog
MyScale Blog

博客园 - Zzx飘遥

发布一个注册类型库(TypeLib)的小工具 【软件发布】发布一个查单词的小工具 COM 入门(4) COM 入门(3) COM 入门(2) COM 入门(1) C#内嵌汇编代码的讨论 仿Win7显示桌面的工具 Deep Zoom Composer初探 Silverlight3离线运行 [译]理解Windows消息循环 WPF BitmapImage与byte[]的转换 VC++中启用XP主题外观 C#4.0初探:dynamic 关键字 - Zzx飘遥 - 博客园 四个字节整型转换为IP格式 - Zzx飘遥 - 博客园 拯救开启桌面效果后白屏的openSUSE 遭遇SqlDataReader锁定表 软件更新:网页设计师必备 之 网站截图工具 (附源码) C#4.0初探: Optional and named parameters
ASP.NET VirtualPathProvider (下)
Zzx飘遥 · 2009-07-26 · via 博客园 - Zzx飘遥

上一篇介绍了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(

0, SeekOrigin.Begin); return stream;
            }
            
finally
            {
                
if (sr != null)
                {
                    sr.Close();
                    sr.Dispose();
                }
            }
        }
    }
public class MyVirtualDirectory : VirtualDirectory
    {
        
string vDir = null;
        ArrayList children
= new ArrayList();
        ArrayList dirs
= new ArrayList();
        ArrayList files
= new ArrayList(); public MyVirtualDirectory(string virtualDirectory)
            :
base(virtualDirectory)
        {
            vDir
= virtualDirectory;
            InitData();
        }
private void InitData()
        {
            
if (string.IsNullOrEmpty(vDir))
            {
                children.Add(
"vdir1");
                children.Add(
"vdir2");
                children.Add(
"vdir3");
                children.Add(
"vdir4");

                dirs.Add(

"vdir1");
                dirs.Add(
"vdir2");
                dirs.Add(
"vdir3");
                dirs.Add(
"vdir4");

                children.Add(

"vfile1.aspx");
                children.Add(
"vfile2.aspx");
                children.Add(
"vfile3.aspx");
                children.Add(
"vfile4.aspx");

                files.Add(

"vfile1.aspx");
                files.Add(
"vfile2.aspx");
                files.Add(
"vfile3.aspx");
                files.Add(
"vfile4.aspx");
            }
            
else
            {
                children.Add(
"vfile1.aspx");
                children.Add(
"vfile2.aspx");
                children.Add(
"vfile3.aspx");
                children.Add(
"vfile4.aspx");

                files.Add(

"vfile1.aspx");
                files.Add(
"vfile2.aspx");
                files.Add(
"vfile3.aspx");
                files.Add(
"vfile4.aspx");
            }
        }
public override System.Collections.IEnumerable Children
        {
            
get { return children; }
        }
public override System.Collections.IEnumerable Directories
        {
            
get { return dirs; }
        }
public override System.Collections.IEnumerable Files
        {
            
get { return files; }
        }
    }
}

首先定义了虚拟路径提供者,然后实现了虚拟文件和虚拟目录。值得一提的是,实现虚拟路径时,必须重载VirtualPathProvider的GetCacheDependency方法,可以实现自己的CacheDependency或直接返回null,否则会抛出找不到目录的异常。

运行截图: