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)

<AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level := AspNetHostingPermissionLevel.Minimal)> _
<AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level := AspNetHostingPermissionLevel.Minimal)> _
Public MustInherit Class VirtualFile _
	Inherits VirtualFileBase
Dim instance As VirtualFile

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>

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

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

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

.NET Framework

Supported in: 3.5, 3.0, 2.0