在内存中提取 tgz 文件并在 C# 中访问文件

Extract tgz file in memory and access files in C#

我有一项服务可以从远程端点下载 *.tgz 文件。我使用 SharpZipLib 提取该压缩存档的内容并将其写入磁盘。但现在我想阻止将文件写入磁盘(因为该进程对该磁盘没有写权限)并将它们保存在内存中。

如何从内存中访问解压后的文件? (我们假设存档包含简单的文本文件

这是我目前的情况:

    public void Decompress(byte[] byteArray)
    {
        Stream inStream = new MemoryStream(byteArray);
        Stream gzipStream = new GZipInputStream(inStream);

        TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream);
        tarArchive.ExtractContents(@".");
        tarArchive.Close();

        gzipStream.Close();
        inStream.Close();
    }

检查 this and this

事实证明,ExtractContents() 通过迭代 TarInputStream 来工作。当您像这样创建 TarArchive 时:

TarArchive.CreateInputTarArchive(gzipStream);

它实际上将您传递的流包装到 TarInputStream 中。因此,如果您想更精细地控制提取文件的方式,则必须直接使用 TarInputStream

看看,是否可以像这样遍历文件、目录和实际文件内容:

Stream inStream = new MemoryStream(byteArray);
Stream gzipStream = new GZipInputStream(inStream);

using (var tarInputStream = new TarInputStream(gzipStream))
{
    TarEntry entry;
    while ((entry = tarInputStream.GetNextEntry()) != null)
    {
        var fileName = entry.File;
        using (var fileContents = new MemoryStream())
        {
            tarInputStream.CopyEntryContents(fileContents);

            // use entry, fileName or fileContents here
        }
    }
}