【问题标题】:Extract tgz file in memory and access files in C#在内存中提取 tgz 文件并在 C# 中访问文件
【发布时间】:2019-09-03 15:59:27
【问题描述】:

我有一个从远程端点下载*.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();
    }

【问题讨论】:

    标签: c# .net-core sharpziplib


    【解决方案1】:

    检查thisthis

    事实证明,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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多