如何从dlm文件文本字符串创建.tar.gz文件?现有代码生成后解压失败
生成.tar.gz文件失败问题解答
你当前的代码只是将读取到的dlm文本内容直接写入了一个后缀为.tar.gz的普通文本文件,既没有做tar归档打包,也没有做gzip压缩,生成的文件本质不是合法的压缩归档文件,因此手动解压必然失败。
你代码中的两处核心错误
- 使用
StreamWriter写入二进制格式的压缩文件:StreamWriter是文本写入专用类,会自动处理字符编码转换,直接写入会破坏压缩文件的二进制结构,完全不适用.tar.gz这类二进制文件的写入场景。 - 缺失.tar.gz生成的核心流程:合法的.tar.gz文件需要先将目标文件打包为tar归档格式,再对tar归档做gzip压缩,两个步骤缺一不可,你当前只是给普通文本文件修改了后缀名,没有执行任何归档、压缩操作。
.NET环境下的正确实现方案
如果使用.NET 5及以上版本,可以直接用官方自带的TarArchive和GZipStream类完成打包压缩,示例代码如下:
using System.IO; using System.IO.Compression; using System.Text; // 待写入的dlm文本内容 string dlmContent = text.ToString(); // 输出的.tar.gz文件路径 string targetFileName = @"C:\Folder\xxx.tar.gz"; // 打包到tar内部的dlm文件名 string entryFileName = "source.dlm"; // 1. 创建GZip压缩流 using (var gzStream = new GZipStream(File.Create(targetFileName), CompressionLevel.Optimal)) { // 2. 基于GZip流创建Tar归档输出流 using (var tarArchive = TarArchive.CreateOutputTarArchive(gzStream)) { // 3. 将dlm文本转为二进制写入内存流 byte[] dlmBytes = Encoding.Default.GetBytes(dlmContent); using (var ms = new MemoryStream(dlmBytes)) { // 4. 创建Tar条目 TarEntry entry = TarEntry.CreateTarEntry(entryFileName); entry.Size = ms.Length; entry.ModTime = DateTime.Now; // 5. 写入条目到归档 tarArchive.WriteEntry(entry, false); ms.CopyTo(tarArchive.ArchiveOutputStream); tarArchive.ArchiveOutputStream.Flush(); } } }
如果使用低于.NET 5的版本,可以引入第三方库SharpZipLib完成相同的打包压缩逻辑。
如果你只需要压缩单个dlm文件,不需要打包多文件,也可以直接生成.gz格式文件,省略tar归档步骤即可。
内容的提问来源于stack exchange,提问作者Arun Madathil M
相关产品推荐
相关产品推荐

