何时关闭文件流

时间:2019-05-14 19:29:15

标签: c# sharpziplib data-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方法返回时,该文件流不可用;如果在该方法中将其关闭,我将返回的流zipStream将被关闭。 如何关闭fsIn但仍然读取方法返回的数据流?

1 个答案:

答案 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 );
}