何时关闭文件流

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;

        // ..
    } 
}