c# – 读取tgz归档文件而不保存/解压缩到磁盘
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 读取tgz归档文件而不保存/解压缩到磁盘,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3153字,纯文字阅读大概需要5分钟。
内容图文
![c# – 读取tgz归档文件而不保存/解压缩到磁盘](/upload/InfoBanner/zyjiaocheng/793/1bb518377b8b4b2e8f742ddfecdd2882.jpg)
我一直在寻找一种解决方案,使用C#从.tgz或.tar.gz存档中读取一个或多个文件,而无需将文件解压缩到磁盘.
我已经确定了许多在GNU许可下发布的第三方库,允许某人提取.tgz存档但是没有任何运气找到解决方案来读取文件而不先提取它.
如果可能的话,我想坚持标准库 – 有没有人有使用GZipStream或任何其他方法的解决方案?谢谢!
编辑:
我想实现类似于以下内容:
public static void Decompress2(FileInfo fileToDecompress)
{
using (FileStream fileStream = fileToDecompress.OpenRead())
{
using (var memStream = new MemoryStream())
{
string currentFileName = fileToDecompress.FullName;
string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);
using (FileStream decompressedFileStream = File.Create(newFileName))
{
using (GZipStream decompressionStream = new GZipStream(fileStream, CompressionMode.Decompress))
{
byte[] bytes = new byte[4096];
int n;
while ((n = decompressionStream.Read(bytes, 0, bytes.Length)) != 0)
{
memStream.Write(bytes, 0, n);
}
}
}
}
}
}
文件是从.tgz或.tar.gz存档中提取并加载到内存中的.一旦提取到内存,我需要能够读取提取文件的内容.提供的代码应该允许我提取.gz,但我不知道如何添加对.tar的支持或如何在文件加载到内存后读取它.
解决方法:
刚刚使用tar-cs library在New BSD License下实现了(blog post)tar.gz-archive提取示例.该示例演示了如何将tar.gz-archive的内容提取到磁盘.
/// <summary>
/// Example of tar-cs library usage to extract tar.gz-archives.
/// Please use the latest version (from trunk) of the library.
/// </summary>
public static class TarGZip
{
public static void Extract(string inputFile, string outputDirectory)
{
using (FileStream inputStream = File.OpenRead(inputFile))
using (Stream tarStream = UnGZipSteam(inputStream))
{
var tarReader = new TarReader(tarStream);
while (tarReader.MoveNext(false)) // Moves pointer to the next file in the tar archive.
{
ExtractTarEntry(tarReader, outputDirectory);
}
}
}
/// <summary>
/// Since GZipStream.Position Property is not implemented,
/// it is necessary to use MemoryStream as intermediate storage.
/// </summary>
/// <param name="inputStream">The input stream.</param>
/// <returns>Un-gzipped stream.</returns>
private static Stream UnGZipSteam(Stream inputStream)
{
using (GZipStream gZipStream = new GZipStream(inputStream, CompressionMode.Decompress))
{
MemoryStream memoryStream = new MemoryStream();
gZipStream.CopyTo(memoryStream);
memoryStream.Position = 0;
return memoryStream;
}
}
private static void ExtractTarEntry(TarReader tarReader, string outputDirectory)
{
string relativePath = tarReader.FileInfo.FileName;
// Relative path can contain slash, not backslash.
// Use Path.GetFullPath() method to convert path.
string fullPath = Path.GetFullPath(Path.Combine(outputDirectory, relativePath));
switch (tarReader.FileInfo.EntryType)
{
case EntryType.File:
case EntryType.FileObsolete:
using (FileStream outputStream = File.Create(fullPath))
{
// Read data from a current file to a Stream.
tarReader.Read(outputStream);
}
break;
case EntryType.Directory:
Directory.CreateDirectory(fullPath);
break;
default:
throw new NotSupportedException("Not supported entry type: " + tarReader.FileInfo.EntryType);
}
}
}
请注意,由于未实现GZipStream.Position Property,因此必须使用MemoryStream作为中间存储或使用Position属性支持实现GZipStream包装.
内容总结
以上是互联网集市为您收集整理的c# – 读取tgz归档文件而不保存/解压缩到磁盘全部内容,希望文章能够帮你解决c# – 读取tgz归档文件而不保存/解压缩到磁盘所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。