Это интересная идея, но в этом дизайне есть кое-что, что меня беспокоит. Простите, если вы уже рассмотрели это в своем дизайне. Но если ваш дизайн представляет собой простую обертку вокруг 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
. Если вы сделаете это, любой метод, который попытается записать в файл, пока он открыт для чтения (или наоборот), по крайней мере, выдаст исключение.