VirtualFile Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Představuje objekt souboru ve virtuálním souboru nebo prostoru prostředků.
public ref class VirtualFile abstract : System::Web::Hosting::VirtualFileBase
public abstract class VirtualFile : System.Web.Hosting.VirtualFileBase
type VirtualFile = class
inherit VirtualFileBase
Public MustInherit Class VirtualFile
Inherits VirtualFileBase
- Dědičnost
Příklady
Následující příklad kódu je VirtualFile implementace třídy, která kombinuje informace uložené v objektu DataSet se souborem šablony pro vrácení dat HTML. Tento příklad kódu pracuje s příklady kódu pro VirtualPathProvider třídy a VirtualDirectory k poskytování virtuálních prostředků z úložiště dat, které je načteno do objektu DataSet . Úplné pokyny pro kompilaci a spuštění příkladu najdete v části Příklad v přehledu VirtualPathProvider třídy.
Tento příklad má tři části: implementaci VirtualFile třídy, datový soubor XML použitý k naplnění objektu DataSet a soubor šablony stránky.
První příklad kódu je implementace VirtualFile třídy. Jeho konstruktor používá metodu u vlastního VirtualPathProvider objektu k vrácení objektu DataSet . Pak prohledá objekt a DataSet načte informace přidružené k zadané cestě k virtuálnímu souboru. Open V metodě kombinuje informace z objektu DataSet se souborem šablony a vrátí kombinaci jako Stream objekt.
using System;
using System.Data;
using System.IO;
using System.Security.Permissions;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;
namespace Samples.AspNet.CS
{
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class SampleVirtualFile : VirtualFile
{
private string content;
private SamplePathProvider spp;
public bool Exists
{
get { return (content != null); }
}
public SampleVirtualFile(string virtualPath, SamplePathProvider provider)
: base(virtualPath)
{
this.spp = provider;
GetData();
}
protected void GetData()
{
// Get the data from the SamplePathProvider
DataSet ds = spp.GetVirtualData();
// Get the virtual file from the resource table.
DataTable files = ds.Tables["resource"];
DataRow[] rows = files.Select(
String.Format("(name = '{0}') AND (type='file')", this.Name));
// If the select returned a row, store the file contents.
if (rows.Length > 0)
{
DataRow row = rows[0];
content = row["content"].ToString();
}
}
private string FormatTimeStamp(DateTime time)
{
return String.Format("{0} at {1}",
time.ToLongDateString(), time.ToLongTimeString());
}
public override Stream Open()
{
string templateFile = HostingEnvironment.ApplicationPhysicalPath + "App_Data\\template.txt";
string pageTemplate;
DateTime now = DateTime.Now;
// Try to get the page template out of the cache.
pageTemplate = (string)HostingEnvironment.Cache.Get("pageTemplate");
if (pageTemplate == null)
{
// Get the page template.
using (StreamReader reader = new StreamReader(templateFile))
{
pageTemplate = reader.ReadToEnd();
}
// Set template timestamp
pageTemplate = pageTemplate.Replace("%templateTimestamp%",
FormatTimeStamp(now));
// Make pageTemplate dependent on the template file.
CacheDependency cd = new CacheDependency(templateFile);
// Put pageTemplate into cache for maximum of 20 minutes.
HostingEnvironment.Cache.Add("pageTemplate", pageTemplate, cd,
Cache.NoAbsoluteExpiration,
new TimeSpan(0, 20, 0),
CacheItemPriority.Default, null);
}
// Put the page data into the template.
pageTemplate = pageTemplate.Replace("%file%", this.Name);
pageTemplate = pageTemplate.Replace("%content%", content);
// Get the data time stamp from the cache.
DateTime dataTimeStamp = (DateTime)HostingEnvironment.Cache.Get("dataTimeStamp");
pageTemplate = pageTemplate.Replace("%dataTimestamp%",
FormatTimeStamp(dataTimeStamp));
pageTemplate = pageTemplate.Replace("%pageTimestamp%",
FormatTimeStamp(now));
// Put the page content on the stream.
Stream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write(pageTemplate);
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
}
}
Imports System.Data
Imports System.IO
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.Caching
Imports System.Web.Hosting
Namespace Samples.AspNet.VB
<AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal), _
AspNetHostingPermission(SecurityAction.InheritanceDemand, level:=AspNetHostingPermissionLevel.Minimal)> _
Public Class SampleVirtualFile
Inherits VirtualFile
Private content As String
Private spp As SamplePathProvider
Public ReadOnly Property Exists() As Boolean
Get
Return (content <> String.Empty)
End Get
End Property
Public Sub New(ByVal virtualPath As String, ByVal provider As SamplePathProvider)
MyBase.New(virtualPath)
spp = provider
GetData()
End Sub
Protected Sub GetData()
' Get the data from the SamplePathProvider.
Dim spp As SamplePathProvider
spp = CType(HostingEnvironment.VirtualPathProvider, SamplePathProvider)
Dim ds As DataSet
ds = spp.GetVirtualData
' Get the virtual file data from the resource table.
Dim files As DataTable
files = ds.Tables("resource")
Dim rows As DataRow()
rows = files.Select( _
String.Format("(name='{0}') AND (type='file')", Me.Name))
' If the select returned a row, store the file contents.
If (rows.Length > 0) Then
Dim row As DataRow
row = rows(0)
content = row("content").ToString()
End If
End Sub
Private Function FormatTimeStamp(ByVal time As DateTime) As String
Return String.Format("{0} at {1}", _
time.ToLongDateString(), time.ToLongTimeString)
End Function
Public Overrides Function Open() As System.IO.Stream
Dim templateFile As String
templateFile = HostingEnvironment.ApplicationPhysicalPath & "App_Data\template.txt"
Dim pageTemplate As String
Dim now As DateTime
now = DateTime.Now
' Try to get the page template out of the cache.
pageTemplate = CType(HostingEnvironment.Cache.Get("pageTemplate"), String)
If pageTemplate Is Nothing Then
' Get the page template.
Try
pageTemplate = My.Computer.FileSystem.ReadAllText(templateFile)
Catch fileException As Exception
Throw fileException
End Try
' Set template timestamp.
pageTemplate = pageTemplate.Replace("%templateTimestamp%", _
FormatTimeStamp(Now))
' Make pageTemplate dependent on the template file.
Dim cd As CacheDependency
cd = New CacheDependency(templateFile)
' Put pageTemplate into cache for maximum of 20 minutes.
HostingEnvironment.Cache.Add("pageTemplate", pageTemplate, cd, _
Cache.NoAbsoluteExpiration, _
New TimeSpan(0, 20, 0), _
CacheItemPriority.Default, Nothing)
End If
' Put the page data into the template.
pageTemplate = pageTemplate.Replace("%file%", Me.Name)
pageTemplate = pageTemplate.Replace("%content%", content)
' Get the data timestamp from the cache.
Dim dataTimeStamp As DateTime
dataTimeStamp = CType(HostingEnvironment.Cache.Get("dataTimeStamp"), DateTime)
pageTemplate = pageTemplate.Replace("%dataTimestamp%", _
FormatTimeStamp(dataTimeStamp))
' Set a timestamp for the page.
Dim pageTimeStamp As String
pageTimeStamp = FormatTimeStamp(now)
pageTemplate = pageTemplate.Replace("%pageTimestamp%", pageTimeStamp)
' Put the page content on the stream.
Dim stream As MemoryStream
stream = New MemoryStream()
Dim writer As StreamWriter
writer = New StreamWriter(stream)
writer.Write(pageTemplate)
writer.Flush()
stream.Seek(0, SeekOrigin.Begin)
Return stream
End Function
End Class
End Namespace
Druhým příkladem je datový soubor XML, který se používá k naplnění objektu DataSet vráceného vlastním VirtualPathProvider objektem. Tato data XML se používají k předvedení použití VirtualPathProvidertříd , VirtualFilea VirtualDirectory k načtení dat z externích dat a nejsou určena k reprezentaci úložiště dat v produkční kvalitě.
<?xml version="1.0" encoding="utf-8" ?>
<resource type="dir"
path="/vrDir"
parentPath=""
content="">
<resource type="file"
path="/vrDir/Level1FileA.vrf"
parentPath="/vrDir"
content="This is the content of file Level1FileA.">
</resource>
<resource type="file"
path="/vrDir/Level1FileB.vrf"
parentPath="/vrDir"
content="This is the content of file Level1FileB.">
</resource>
<resource type="dir"
path="/vrDir/Level2DirA"
parentPath="/vrDir"
content="">
<resource type="file"
path="/vrDir/Level2DirA/Level2FileA.vrf"
parentPath="/vrDir/Level2DirA"
content="This is the content of file Level2FileA.">
</resource>
<resource type="file"
path="/vrDir/Level2DirA/Level2FileB.vrf"
parentPath="/vrDir/Level2DirA"
content="This is the content of file Level2FileB.">
</resource>
</resource>
<resource type="dir"
path="/vrDir/Level2DirB"
parentPath="/vrDir"
content="">
<resource type="file"
path="/vrDir/Level2DirB/Level2FileA.vrf"
parentPath="/vrDir/Level2DirB"
content="This is the content of file Level2FileA.">
</resource>
<resource type="file"
path="/vrDir/Level2DirB/Level2FileB.vrf"
parentPath="/vrDir/Level2DirB"
content="This is the content of file Level2FileB.">
</resource>
</resource>
</resource>
Třetím příkladem je textový soubor, který se používá jako šablona pro virtuální soubor. Zástupné symboly v souboru jsou reprezentovány textem mezi procenty (%) značkami, například %file%
a %content%
. Časová razítka slouží k monitorování změn dat virtuálních souborů uložených v mezipaměti.
<html>
<head>
<title>File name: %file%</title>
</head>
<body>
<h1>%file%</h1>
<p>%content%</p>
<p>Page timestamp: %pageTimestamp%<br>
Data timestamp: %dataTimestamp%<br>
Template timestamp: %templateTimestamp%</p>
</body>
</html>
Poznámky
Třída VirtualFile je základní třídou pro objekty, které představují soubory ve virtuálním systému souborů. Obvykle byste implementovali descendent VirtualFile třídy pro každý VirtualPathProvider objekt sestupný ve webové aplikaci.
Poznámky pro implementátory
Když dědíte z VirtualFile třídy, musíte přepsat metodu Open() , aby se datový proud jen pro čtení vrátil do obsahu virtuálního prostředku.
Konstruktory
VirtualFile(String) |
Inicializuje novou instanci VirtualFile třídy. |
Vlastnosti
IsDirectory |
Získá hodnotu, která označuje, že se jedná o virtuální prostředek, který by měl být považován za soubor. |
Name |
Získá zobrazovaný název virtuálního prostředku. (Zděděno od VirtualFileBase) |
VirtualPath |
Získá cestu k virtuálnímu souboru. (Zděděno od VirtualFileBase) |
Metody
CreateObjRef(Type) |
Vytvoří objekt, který obsahuje všechny relevantní informace potřebné k vygenerování proxy používaného ke komunikaci se vzdáleným objektem. (Zděděno od MarshalByRefObject) |
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetLifetimeService() |
Zastaralé.
Načte objekt služby aktuální životnosti, který řídí zásady životnosti pro tuto instanci. (Zděděno od MarshalByRefObject) |
GetType() |
Získá aktuální Type instanci. (Zděděno od Object) |
InitializeLifetimeService() |
VirtualFileBase Poskytuje instanci neomezenou životnost tím, že brání vytvoření zapůjčení. (Zděděno od VirtualFileBase) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
MemberwiseClone(Boolean) |
Vytvoří mělkou kopii aktuálního MarshalByRefObject objektu. (Zděděno od MarshalByRefObject) |
Open() |
Při přepsání v odvozené třídě vrátí do virtuálního prostředku datový proud jen pro čtení. |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |