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 . Поток доступен только для чтения и доступен для CanSeek поиска (свойство имеет значение true).
Примечания для тех, кто реализует этот метод
В производных классах Open() метод должен возвращать ищуемый поток. Если метод возвращает поток, который не поддерживает поиск, NotSupportedException при передаче HttpResponse потока в объект для записи данных возникает исключение . Исключение возникает из-за того, что ответ пытается прочитать Length свойство, а в потоке, который недоступен для поиска, попытка получить доступ к свойству вызывает исключение. Дополнительные сведения см. в описании свойства CanSeek.