这是一个有趣的想法,但这个设计有一些让我困扰的地方。如果您已经在设计中解决了这个问题,请原谅我。但是,如果您的设计只是一个简单的包装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
. 如果您这样做,任何在打开文件以进行读取访问(反之亦然)时尝试写入文件的方法至少会引发异常。