这是一个有趣的想法,但也有一些关于这个设计,困扰我。请原谅我,如果你已经在你的设计中解决了这个问题。但是如果你的设计只是一个简单的包装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
类使用FileAccess.Write
打开底层FileStream
来解决这个问题。然后执行一个Rewind
方法关闭此FileStream
,并创建一个使用FileAccess.Read
一个新的。如果你这样做,任何试图写入文件的方法在读取访问时打开(反之亦然),至少会抛出一个异常。
你必须使用的FileStream这一点,你不能使用的MemoryStream?这样你就不必处理与删除文件相关的所有可能的问题。 – armannvg 2009-10-05 12:01:15
@armannvg,你在说什么问题?这是临时存储非常大的文件,然后将其记录到数据库中。 – sh0gged 2009-10-05 12:09:11
只是通常的文件删除问题 - > IOException,UnauthorizedAccessException等,但如果你正在与一个非常大的文件,然后MemoryStream不是一个选项 – armannvg 2009-10-05 12:16:24