VirtualFile Класс

Определение

Представляет объект файла в виртуальном файле или пространстве ресурсов.

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
Наследование

Примеры

Следующий пример кода — это реализация класса, которая объединяет сведения, хранящиеся VirtualFile в DataSet объекте, с файлом шаблона для возврата данных HTML. Этот пример кода работает с примерами кода для и VirtualPathProvider классов для VirtualDirectory предоставления виртуальных ресурсов из хранилища данных, загруженного в DataSet объект. Полные инструкции по компиляции и выполнению примера см. в разделе VirtualPathProvider "Пример" обзора класса.

В этом примере есть три части: VirtualFile реализация класса, XML-файл данных, используемый для заполнения DataSet объекта, и файла шаблона страницы.

Первый пример кода — реализация VirtualFile класса. Его конструктор использует метод в пользовательском VirtualPathProvider объекте для возврата DataSet объекта. Затем он выполняет поиск DataSet объекта, чтобы получить сведения, связанные с предоставленным путем к виртуальному файлу. В методе Open он объединяет сведения из DataSet объекта с файлом шаблона и возвращает сочетание в качестве Stream объекта.

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

Второй пример — XML-файл данных, используемый для заполнения DataSet объекта, возвращаемого пользовательским VirtualPathProvider объектом. Эти XML-данные используются для демонстрации использования VirtualPathProviderи VirtualFileVirtualDirectory классов для извлечения данных из внешних данных и не предназначены для представления хранилища данных с качеством рабочей среды.

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

Третий пример — текстовый файл, используемый в качестве шаблона для виртуального файла. Заполнители в файле представлены текстом между знаками процента (%), например %file% и %content%. Метки времени используются для отслеживания изменений в кэшированных данных виртуального файла.

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

Комментарии

Класс VirtualFile — это базовый класс для объектов, представляющих файлы в виртуальной файловой системе. Как правило, вы реализуете убыватель VirtualFile класса для каждого VirtualPathProvider объекта, нисходящего в веб-приложении.

Примечания для тех, кто реализует этот метод

При наследовании от VirtualFile класса необходимо переопределить Open() метод, чтобы вернуть поток, доступный только для чтения, в содержимое виртуального ресурса.

Конструкторы

Имя Описание
VirtualFile(String)

Инициализирует новый экземпляр класса VirtualFile.

Свойства

Имя Описание
IsDirectory

Возвращает значение, указывающее, что это виртуальный ресурс, который должен рассматриваться как файл.

Name

Возвращает отображаемое имя виртуального ресурса.

(Унаследовано от VirtualFileBase)
VirtualPath

Возвращает путь к виртуальному файлу.

(Унаследовано от VirtualFileBase)

Методы

Имя Описание
CreateObjRef(Type)

Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

(Унаследовано от MarshalByRefObject)
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLifetimeService()
Устаревшие..

Извлекает текущий объект службы времени существования, который управляет политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
InitializeLifetimeService()

Дает экземпляру VirtualFileBase бесконечное время существования, предотвращая создание аренды.

(Унаследовано от VirtualFileBase)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неглубокую копию текущего MarshalByRefObject объекта.

(Унаследовано от MarshalByRefObject)
Open()

При переопределении в производном классе возвращает поток только для чтения виртуальному ресурсу.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к