这是一个有趣的想法,但这个设计中有一些问题让我感到困扰。如果您在设计中已经解决了这个问题,那么请原谅我。但是,如果您的设计只是
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
的方法的事件处理程序,这可能是这个问题最终发生的方式) 第一种方法只会产生无法预料的结果,没有明显的原因。
我认为你可以通过使用
FileAccess.Write
打开基础的
FileStream
,然后实现一个
Rewind
方法来解决这个问题。该方法将关闭这个
FileStream
并创建一个使用
FileAccess.Read
的新文件流。如果你这样做了,在以读访问方式打开文件时(或反之),任何试图写入该文件的方法都至少会抛出异常。