VirtualFile Classe

Definizione

Rappresenta un oggetto file in un file virtuale o in uno spazio risorse.

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
Ereditarietà

Esempio

L'esempio di codice seguente è un'implementazione della VirtualFile classe che combina le informazioni archiviate in un DataSet oggetto con un file modello per restituire dati HTML. Questo esempio di codice funziona con gli esempi di codice per le VirtualPathProvider classi e VirtualDirectory per fornire risorse virtuali da un archivio dati caricato in un DataSet oggetto . Per istruzioni complete per la compilazione e l'esecuzione dell'esempio, vedere la sezione Esempio della panoramica della VirtualPathProvider classe.

Questo esempio include tre parti: l'implementazione della VirtualFile classe, un file di dati XML usato per popolare l'oggetto DataSet e il file modello di pagina.

Il primo esempio di codice è un'implementazione della VirtualFile classe . Il costruttore usa un metodo su un oggetto personalizzato VirtualPathProvider per restituire un DataSet oggetto . Cerca quindi nell'oggetto DataSet di recuperare le informazioni associate al percorso del file virtuale specificato. Open Nel metodo combina le informazioni dell'oggetto DataSet con un file modello e restituisce la combinazione come Stream oggetto .

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

Il secondo esempio è il file di dati XML utilizzato per popolare l'oggetto DataSet restituito dall'oggetto personalizzato VirtualPathProvider . Questi dati XML vengono usati per illustrare l'utilizzo delle VirtualPathProviderclassi , VirtualFilee VirtualDirectory per recuperare dati da dati esterni e non rappresentano un archivio dati di qualità di produzione.

<?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>

Il terzo esempio è il file di testo usato come modello per il file virtuale. I segnaposto nel file sono rappresentati da contrassegni di percentuale (%) , ad esempio %file% e %content%. I timestamp vengono usati per monitorare le modifiche ai dati dei file virtuali memorizzati nella cache.

<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>

Commenti

La VirtualFile classe è la classe base per gli oggetti che rappresentano i file in un file system virtuale. In genere, si implementa un discendente della VirtualFile classe per ogni VirtualPathProvider oggetto discendente nell'applicazione Web.

Note per gli implementatori

Quando si eredita dalla VirtualFile classe , è necessario eseguire l'override del Open() metodo per restituire un flusso di sola lettura al contenuto della risorsa virtuale.

Costruttori

Nome Descrizione
VirtualFile(String)

Inizializza una nuova istanza della classe VirtualFile.

Proprietà

Nome Descrizione
IsDirectory

Ottiene un valore che indica che si tratta di una risorsa virtuale che deve essere considerata come un file.

Name

Ottiene il nome visualizzato della risorsa virtuale.

(Ereditato da VirtualFileBase)
VirtualPath

Ottiene il percorso del file virtuale.

(Ereditato da VirtualFileBase)

Metodi

Nome Descrizione
CreateObjRef(Type)

Crea un oggetto che contiene tutte le informazioni pertinenti necessarie per generare un proxy utilizzato per comunicare con un oggetto remoto.

(Ereditato da MarshalByRefObject)
Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetLifetimeService()
Obsoleti.

Recupera l'oggetto servizio di durata corrente che controlla i criteri di durata per questa istanza.

(Ereditato da MarshalByRefObject)
GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
InitializeLifetimeService()

Fornisce a un'istanza una VirtualFileBase durata infinita impedendo la creazione di un lease.

(Ereditato da VirtualFileBase)
MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
MemberwiseClone(Boolean)

Crea una copia superficiale dell'oggetto corrente MarshalByRefObject .

(Ereditato da MarshalByRefObject)
Open()

Quando sottoposto a override in una classe derivata, restituisce un flusso di sola lettura alla risorsa virtuale.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a