何时关闭文件流
When to close file stream
我使用这样的流读取 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 方法 return 时它不可用,如果我在方法中关闭它,我是 return 的流 zipStream ing 将被关闭。
我怎样才能关闭 fsIn 但仍然从我的方法中读取数据流 return?
您应该将 return 类型更改为同时包含父 FileStream
和内部 file-stream 的对象,以便您函数的使用者可以在它们关闭时关闭两个流需要 - 或者,您可以使用您自己的类型对 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 );
}
这样消费:
void Foo()
{
using( ReadFileResult rfr = ReadFile( ... ) )
{
Stream s = rdr.InnerFileStream;
// ..
}
}
我使用这样的流读取 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 方法 return 时它不可用,如果我在方法中关闭它,我是 return 的流 zipStream ing 将被关闭。 我怎样才能关闭 fsIn 但仍然从我的方法中读取数据流 return?
您应该将 return 类型更改为同时包含父 FileStream
和内部 file-stream 的对象,以便您函数的使用者可以在它们关闭时关闭两个流需要 - 或者,您可以使用您自己的类型对 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 );
}
这样消费:
void Foo()
{
using( ReadFileResult rfr = ReadFile( ... ) )
{
Stream s = rdr.InnerFileStream;
// ..
}
}