共用方式為


VirtualFile.Open 方法

定義

在衍生類別中覆寫時,會將唯讀資料流傳回虛擬資源。

public:
 abstract System::IO::Stream ^ Open();
public abstract System.IO.Stream Open ();
abstract member Open : unit -> System.IO.Stream
Public MustOverride Function Open () As Stream

傳回

到虛擬檔案的唯讀資料流。

範例

下列程式碼範例是 方法的 Open 實作,可將虛擬檔案特定資訊與範本檔案結合,然後傳回組合。 系統會快取範本檔案,以減少讀取檔案系統多次以擷取範本檔案的額外負荷。 如需執行範例所需的完整程式碼,請參閱類別概觀的 VirtualFile 範例一節。

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

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

備註

方法 Open 會傳回資料流程,其中包含 類別 VirtualPathProvider 視為檔案的資料。 資料流程是唯讀的,而且在屬性為 true (CanSeek 可搜尋) 。

給實施者的注意事項

在衍生類別中, Open() 方法必須傳回可搜尋的資料流程。 如果方法傳回不支援搜尋的資料流程,當資料流程傳遞至 物件以寫出資料時, NotSupportedException 會擲回 HttpResponse 。 發生例外狀況的原因是回應嘗試讀取 Length 屬性,而且在無法搜尋的資料流程上,嘗試存取屬性會造成例外狀況。 如需詳細資訊,請參閱 CanSeek 屬性 (Property)。

適用於