VirtualDirectory 類別

定義

表示虛擬檔案或資源空間中的目錄物件。

public ref class VirtualDirectory abstract : System::Web::Hosting::VirtualFileBase
public abstract class VirtualDirectory : System.Web.Hosting.VirtualFileBase
type VirtualDirectory = class
    inherit VirtualFileBase
Public MustInherit Class VirtualDirectory
Inherits VirtualFileBase
繼承

範例

下列程式碼範例是類別 VirtualDirectory 實作,可傳回儲存在 物件中的 DataSet 虛擬目錄資訊。 此程式碼適用于 和 VirtualFile 類別的程式碼範例 VirtualPathProvider ,以從載入至 DataSet 物件的資料存放區提供虛擬資源。 如需編譯和執行範例的完整指示,請參閱類別概觀的 VirtualPathProvider 一節。

這個範例有兩個部分: VirtualDirectory 類別實作和用來填入 DataSet 物件的 XML 資料檔案。

第一個程式碼範例是 類別的實作 VirtualDirectory 。 在建構函式中,它會在自訂 VirtualPathProvider 物件上使用 方法傳回 DataSet 物件。 然後, DataSet 它會搜尋 物件,以擷取與所提供虛擬路徑相關聯的目錄資訊。

using System;
using System.Collections;
using System.Data;
using System.Security.Permissions;
using System.Web;
using System.Web.Hosting;

namespace Samples.AspNet.CS
{
  [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
  [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
  public class SampleVirtualDirectory : VirtualDirectory
  {
    SamplePathProvider spp;

    private bool exists;
    public bool Exists
    {
      get { return exists; }
    }

    public SampleVirtualDirectory(string virtualDir, SamplePathProvider provider)
      : base(virtualDir)
    {
      spp = provider;
      GetData();
    }

    protected void GetData()
    {
      DataSet ds = spp.GetVirtualData();

      // Clean up the path to match data in resource file.
      string path = VirtualPath.Replace(HostingEnvironment.ApplicationVirtualPath, "");
      path = path.TrimEnd('/');

      // Get the virtual directory from the resource table.
      DataTable dirs = ds.Tables["resource"];
      DataRow[] rows = dirs.Select(
        String.Format("(name = '{0}') AND (type='dir')", path));

      // If the select returned a row, the directory exists.
      if (rows.Length > 0)
      {
        exists = true;

        // Get children from the resource table.
        // This technique works for small numbers of virtual resources.
        //   Sites with moderate to large numbers of virtual
        //   resources should choose a method that consumes fewer
        //   computer resources.
        DataRow[] childRows = dirs.Select(
          String.Format("parentPath = '{0}'", path));

        foreach (DataRow childRow in childRows)
        {
          string childPath = (string)childRow["path"];

          if (childRow["type"].ToString() == "dir")
          {
            SampleVirtualDirectory svd = new SampleVirtualDirectory(childPath, spp);
            children.Add(svd);
            directories.Add(svd);
          }
          else
          {
            SampleVirtualFile svf = new SampleVirtualFile(childPath, spp);
            children.Add(svf);
            files.Add(svf);
          }
        }
      }
    }

    private ArrayList children = new ArrayList();
    public override IEnumerable Children
    {
      get { return children; }
    }

    private ArrayList directories = new ArrayList();
    public override IEnumerable Directories
    {
      get { return directories; }
    }

    private ArrayList files = new ArrayList();
    public override IEnumerable Files
    {
      get { return files; }
    }
  }
}

Imports System.Data
Imports System.Collections
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.Hosting


Namespace Samples.AspNet.VB
  <AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal), _
   AspNetHostingPermission(SecurityAction.InheritanceDemand, level:=AspNetHostingPermissionLevel.Minimal)> _
  Public Class SampleVirtualDirectory
    Inherits VirtualDirectory

    Private spp As SamplePathProvider

    ' Declare the variable the property uses.
    Private existsValue As Boolean

    Public ReadOnly Property exists() As Boolean
      Get
        Return existsValue
      End Get
    End Property

    Public Sub New(ByVal virtualDir As String, ByVal provider As SamplePathProvider)
      MyBase.New(virtualDir)
      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

      ' Clean up the path to match data in resource file.
      Dim path As String
      path = VirtualPath.Replace(HostingEnvironment.ApplicationVirtualPath, "")
      Dim trimChars() As Char = {"/"c}
      path = path.TrimEnd(trimChars)

      ' Get the virtual directory from the resource table.
      Dim dirs As DataTable
      dirs = ds.Tables("resource")
      Dim rows As DataRow()
      rows = dirs.Select( _
        String.Format("(name = '{0}') AND (type='dir')", path))

      ' If the select returned a row, the directory exits.
      If (rows.Length > 0) Then
        existsValue = True

        ' Get the children from the resource table.
        ' This technique works for small numbers of virtual resources.
        '  Sites with moderate to large numbers of virtual
        '  resources should choose a method that consumes fewer
        '  computer resources.
        Dim childRows As DataRow()
        childRows = dirs.Select( _
          String.Format("parentPath = '{0}'", path))

        For Each childRow As DataRow In childRows
          Dim childPath As String
          childPath = CType(childRow("path"), String)

          If (childRow("type").ToString = "dir") Then
            Dim svd As New SampleVirtualDirectory(childPath, spp)
            childrenValue.Add(svd)
            directoriesValue.Add(svd)
          Else
            Dim svf As New SampleVirtualFile(childPath, spp)
            childrenValue.Add(svf)
            directoriesValue.Add(svf)
          End If
        Next

      End If
    End Sub

    Private childrenValue As ArrayList
    Public Overrides ReadOnly Property Children() As System.Collections.IEnumerable
      Get
        Return childrenValue
      End Get
    End Property

    Private directoriesValue As ArrayList
    Public Overrides ReadOnly Property Directories() As System.Collections.IEnumerable
      Get
        Return directoriesValue
      End Get
    End Property

    Private filesValue As ArrayList
    Public Overrides ReadOnly Property Files() As System.Collections.IEnumerable
      Get
        Return filesValue
      End Get
    End Property
  End Class

End Namespace

第二個範例是 XML 資料檔案,用來填入 DataSet 自訂 VirtualPathProvider 物件所傳回的物件。 此 XML 資料用來示範如何使用 VirtualPathProviderVirtualFileVirtualDirectory 類別從外部資料擷取資料,而且不適合代表生產品質的資料存放區。

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

備註

類別 VirtualDirectory 是代表虛擬檔案系統中目錄之物件的基類。 一般而言,您會針對 Web 應用程式中的每個 VirtualPathProvider 類別子系實作 類別的 VirtualDirectory 子系。

給實施者的注意事項

當您繼承自 類別時 VirtualDirectory ,必須覆寫 ChildrenDirectoriesFiles 屬性,以傳回實作 介面的物件 IEnumerable

如果您的虛擬目錄結構包含中到大量的虛擬資源,您應該小心,藉由呼叫 ChildrenDirectoriesFiles 屬性來列舉虛擬目錄時,將耗用的系統資源最小化。

建構函式

VirtualDirectory(String)

初始化 VirtualDirectory 類別的新執行個體。

屬性

Children

取得這個虛擬目錄中包含之檔案和子目錄的清單。

Directories

取得這個目錄中包含之所有子目錄的清單。

Files

取得這個目錄中包含之所有檔案的清單。

IsDirectory

取得值,指出這是應視為目錄的虛擬資源。

Name

取得虛擬資源的顯示名稱。

(繼承來源 VirtualFileBase)
VirtualPath

取得虛擬檔案路徑。

(繼承來源 VirtualFileBase)

方法

CreateObjRef(Type)

建立包含所有相關資訊的物件,這些資訊是產生用來與遠端物件通訊的所需 Proxy。

(繼承來源 MarshalByRefObject)
Equals(Object)

判斷指定的物件是否等於目前的物件。

(繼承來源 Object)
GetHashCode()

做為預設雜湊函式。

(繼承來源 Object)
GetLifetimeService()
已淘汰.

擷取控制這個執行個體存留期 (Lifetime) 原則的目前存留期服務物件。

(繼承來源 MarshalByRefObject)
GetType()

取得目前執行個體的 Type

(繼承來源 Object)
InitializeLifetimeService()

藉由防止建立使用期 (Lease),為 VirtualFileBase 執行個體提供無限的存留期 (Lifetime)。

(繼承來源 VirtualFileBase)
MemberwiseClone()

建立目前 Object 的淺層複製。

(繼承來源 Object)
MemberwiseClone(Boolean)

建立目前 MarshalByRefObject 物件的淺層複本。

(繼承來源 MarshalByRefObject)
ToString()

傳回代表目前物件的字串。

(繼承來源 Object)

適用於

另請參閱