This documentation is archived and is not being maintained.

VirtualFile Class

Represents a file object in a virtual file or resource space.

Namespace:  System.Web.Hosting
Assembly:  System.Web (in System.Web.dll)

Public MustInherit Class VirtualFile _
	Inherits VirtualFileBase

The VirtualFile type exposes the following members.

Protected methodVirtualFileInitializes a new instance of the VirtualFile class.

Public propertyIsDirectoryGets a value that indicates that this is a virtual resource that should be treated as a file. (Overrides VirtualFileBase.IsDirectory.)
Public propertyNameGets the display name of the virtual resource. (Inherited from VirtualFileBase.)
Public propertyVirtualPathGets the virtual file path. (Inherited from VirtualFileBase.)

Public methodCreateObjRefCreates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object. (Inherited from MarshalByRefObject.)
Public methodEquals(Object)Determines whether the specified Object is equal to the current Object. (Inherited from Object.)
Protected methodFinalizeAllows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public methodGetHashCodeServes as a hash function for a particular type. (Inherited from Object.)
Public methodGetLifetimeServiceRetrieves the current lifetime service object that controls the lifetime policy for this instance. (Inherited from MarshalByRefObject.)
Public methodGetTypeGets the Type of the current instance. (Inherited from Object.)
Public methodInitializeLifetimeServiceGives a VirtualFileBase instance an infinite lifetime by preventing a lease from being created. (Inherited from VirtualFileBase.)
Protected methodMemberwiseCloneCreates a shallow copy of the current Object. (Inherited from Object.)
Protected methodMemberwiseClone(Boolean)Creates a shallow copy of the current MarshalByRefObject object. (Inherited from MarshalByRefObject.)
Public methodOpenWhen overridden in a derived class, returns a read-only stream to the virtual resource.
Public methodToStringReturns a string that represents the current object. (Inherited from Object.)

The VirtualFile class is the base class for objects that represent files in a virtual file system. Typically, you would implement a descendent of the VirtualFile class for each VirtualPathProvider object descendent in your Web application.

Notes to Inheritors

When you inherit from the VirtualFile class, you must override the Open method to return a read-only stream to the contents of the virtual resource.

The following code example is a VirtualFile class implementation that combines information stored in a DataSet object with a template file to return HTML data. This code example works with the code examples for the VirtualPathProvider and VirtualDirectory classes to provide virtual resources from a data store that is loaded into a DataSet object. For the complete instructions for compiling and running the example, see the Example section of the VirtualPathProvider class overview.

This example has three parts: the VirtualFile class implementation, an XML data file used to populate the DataSet object, and the page template file.

The first code example is an implementation of the VirtualFile class. Its constructor uses a method on a custom VirtualPathProvider object to return a DataSet object. It then searches the DataSet object to retrieve the information associated with the virtual file path provided. In the Open method, it combines the information from the DataSet object with a template file and returns the combination as a Stream object.

Imports Microsoft.VisualBasic

Imports System
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
        Return (content <> String.Empty)
      End Get
    End Property

    Public Sub New(ByVal virtualPath As String, ByVal provider As SamplePathProvider)
      spp = provider
    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.
          pageTemplate = My.Computer.FileSystem.ReadAllText(templateFile)
        Catch fileException As Exception
          Throw fileException
        End Try

        ' Set template timestamp.
        pageTemplate = pageTemplate.Replace("%templateTimestamp%", _

        ' 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%", _

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

      stream.Seek(0, SeekOrigin.Begin)

      Return stream
    End Function
  End Class
End Namespace

The second example is the XML data file used to populate the DataSet object returned by the custom VirtualPathProvider object. This XML data is used to demonstrate using the VirtualPathProvider, VirtualFile, and VirtualDirectory classes to retrieve data from external data, and is not intended to represent a production-quality data store.

<?xml version="1.0" encoding="utf-8" ?>
<resource type="dir" 
  <resource type="file" 
            content="This is the content of file Level1FileA.">
  <resource type="file" 
            content="This is the content of file Level1FileB.">
  <resource type="dir" 
    <resource type="file" 
              content="This is the content of file Level2FileA.">
    <resource type="file" 
              content="This is the content of file Level2FileB.">
  <resource type="dir" 
    <resource type="file" 
              content="This is the content of file Level2FileA.">
    <resource type="file" 
              content="This is the content of file Level2FileB.">

The third example is the text file used as a template for the virtual file. Placeholders in the file are represented by text between percent (%) marks, such as %file% and %content%. Timestamps are used to monitor changes to cached virtual file data.

    <title>File name: %file%</title>

    <p>Page timestamp: %pageTimestamp%<br>
       Data timestamp: %dataTimestamp%<br>
       Template timestamp: %templateTimestamp%</p>

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.