VirtualFile.Open Metoda

Definicja

Gdy jest zastępowany w klasie pochodnej, zwraca strumień tylko do odczytu do zasobu wirtualnego.When overridden in a derived class, returns a read-only stream to the virtual resource.

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

Zwraca

Stream

Strumień tylko do odczytu do pliku wirtualnego.A read-only stream to the virtual file.

Przykłady

Poniższy przykład kodu jest implementacją Open metody, która łączy informacje specyficzne dla pliku wirtualnego z plikiem szablonu, a następnie zwraca kombinację.The following code example is an implementation of the Open method that combines virtual-file-specific information with a template file and then returns the combination. Plik szablonu jest w pamięci podręcznej, aby zmniejszyć obciążenie odczytywania systemu plików wiele razy, aby pobrać plik szablonu.The template file is cached to reduce the overhead of reading the file system multiple times to retrieve the template file. Aby uzyskać pełny kod wymagany do uruchomienia tego przykładu, zobacz sekcję przykład VirtualFile omówienia klasy.For the full code required to run the example, see the Example section of the VirtualFile class overview.

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

Uwagi

OpenMetoda zwraca strumień zawierający dane traktowane jako plik przez VirtualPathProvider klasę.The Open method returns a stream containing the data treated as a file by the VirtualPathProvider class. Strumień jest tylko do odczytu i jest możliwy do przeszukania ( CanSeek Właściwość ma wartość true).The stream is read-only and is seekable (the CanSeek property is true).

Uwagi dotyczące implementowania

W klasach pochodnych Open() Metoda musi zwracać strumień możliwy do przeszukiwania.In derived classes the Open() method must return a seekable stream. Jeśli metoda zwraca strumień, który nie obsługuje wyszukiwania, NotSupportedException jest zgłaszany, gdy strumień jest przesyłany do HttpResponse obiektu w celu zapisania danych.If the method returns a stream that does not support seeking, a NotSupportedException is thrown when the stream is passed to the HttpResponse object to write out the data. Wyjątek występuje, ponieważ odpowiedź próbuje odczytać Length Właściwość, a w strumieniu, który nie jest możliwy do odszukania, próbuje uzyskać dostęp do właściwości powoduje wyjątek.The exception occurs because the response tries to read the Length property, and on a stream that is not seekable, attempting to access the property causes an exception. Aby uzyskać więcej informacji, zobacz CanSeek Właściwość.For more information, see the CanSeek property.

Dotyczy