我使用这样的流读取zip文件中的文件:
public static Stream ReadFile(Models.Document document, string path, string password, string fileName)
{
FileStream fsIn = System.IO.File.OpenRead(Path.Combine(path, $"{document.guid}.crypt"));
var zipFile = new ZipFile(fsIn)
{
//Password = password,
IsStreamOwner = true
};
var zipEntry = zipFile.GetEntry(fileName);
//zipEntry.AESKeySize = 256;
Stream zipStream = zipFile.GetInputStream(zipEntry);
return zipStream;
}
我在关闭文件流fsIn时遇到麻烦,因为当我从ReadFile方法返回时,该文件流不可用;如果在该方法中将其关闭,我将返回的流zipStream将被关闭。 如何关闭fsIn但仍然读取方法返回的数据流?
答案 0 :(得分:2)
您应该将返回类型更改为同时包含父FileStream
和内部文件流的对象,以便函数的使用者可以在需要时关闭两个流-或者,可以子类化{ {1}}(您自己的类型),然后假定这两个流都拥有所有权。前者可能更简单,否则您将不得不代理所有Stream
方法。
像这样:
Stream
像这样消耗:
sealed class ReadFileResult : IDisposable
// (use a `sealed` class with a non-virtual Dispose method for simpler compliance with IDisposable)
{
private readonly FileStream zipFileStream;
public Stream InnerFileStream { get; }
internal ReadFileResult( FileStream zipFileStream, Stream innerFileStream )
{
this.zipeFileStream = zipFileStream;
this.InnerFileStream = innerFileStream;
}
public void Dispose()
{
this.InnerFileStream.Dispose();
this.zipFileStream.Dispose();
}
}
public static ReadFileResult ReadFile(Models.Document document, string path, string password, string fileName)
{
// ...
return new ReadFileResult( zipFileStream: fsIn, innerFileStream: zipStream );
}