在内存中提取 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();
}
事实证明,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
}
}
}
我有一项服务可以从远程端点下载 *.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();
}
事实证明,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
}
}
}