Это интересная идея, но что-то в этом дизайне меня беспокоит. Простите меня, если вы уже рассмотрели это в своем дизайне. Но если ваш дизайн представляет собой простую обертку вокруг FileStream
, возникает тонкая, но, как мне кажется, существенная проблема.
Если вы удаляете файл, когда поток закрыт, это означает, что единственный способ фактически использовать данные в файле — это если FileAccess
равно ReadWrite
. Верный? Другими словами, вы будете использовать файл с кодом, который выглядит следующим образом:
using (TempFileStream t as new TempFileStream())
{
WriteDataToTempFile(t);
t.Seek(0, SeekOrigin.Begin);
ReadDataFromTempFile(t);
}
Я вижу проблему в том, что ReadDataFromTempFile
ожидает, что файл будет открыт для чтения, а не для чтения/записи. И это открывает дверь для некоторых ошибок, которые, я думаю, будет очень трудно найти. Рассмотрим такой код:
using (TempFileStream t as new TempFileStream())
{
MyClass o = new MyClass(o);
o.TempStream = t;
o.ProduceOutput();
t.Seek(0, SeekOrigin.Begin);
o.ProcessOutput();
}
...по сравнению с этим:
MyClass o = new MyClass();
string n = Path.GetTempFileName();
using (FileStream s = new FileStream(n, FileMode.Create, FileAccess.Write))
{
o.TempStream = t;
o.ProduceOutput();
}
using (FileStream s = new FileStream(n, FileMode.Open, FileAccess.Read))
{
o.TempStream = t;
o.ProcessOutput();
}
File.Delete(n);
Конечно, первый метод короче второго. Но второй метод вызовет исключение, если ProcessOutput
вызовет метод, который записывает в TempStream
. (Или устанавливает свойство, чей метод доступа set вызывает событие, обработчик которого отправляет вызов методу, который записывает в TempStream
, что, вероятно, приведет к возникновению этой проблемы.) Первый просто выдаст неожиданные результаты без видимой причины.
Я думаю, вы можете обойти это, если ваш класс TempFileStream
откроет базовый FileStream
с помощью FileAccess.Write
. Затем реализуйте метод Rewind
, закрывающий этот FileStream
и создающий новый, использующий FileAccess.Read
. Если вы сделаете это, любой метод, который попытается записать в файл, когда он открыт для чтения (или наоборот), как минимум выдаст исключение.
person
Robert Rossney
schedule
05.10.2009