如何在内存中生成Ini文件并直接加入Zip归档,无需写入磁盘?
解决方案:内存生成Ini并加入Zip归档(无需落地磁盘)
完全可以实现,核心思路是用MemoryStream承载Ini文件内容,再将这个内存流直接写入Zip归档条目,全程不涉及磁盘操作。以下是具体实现步骤和修改后的代码:
1. 内存生成Ini内容
根据你使用的IniFile类是否支持写入流,分两种情况处理:
情况A:IniFile支持写入流
如果你的IniFile类可以接受TextWriter或Stream作为输出目标,直接将内容写入MemoryStream:
// 创建内存流存储Ini内容,leaveOpen设为true避免流被提前关闭 var iniStream = new MemoryStream(); using (var writer = new StreamWriter(iniStream, Encoding.UTF8, leaveOpen: true)) { var ini = new IniFile(writer); // 假设IniFile支持TextWriter构造 ini.Write("accountId", "1", "Settings"); ini.Write("singleMode", "1", "Settings"); // 其他Ini写入操作... } iniStream.Position = 0; // 重置流指针到开头,确保后续复制能读取完整内容
情况B:IniFile仅支持写入磁盘
如果IniFile类没有流写入能力,手动构造Ini格式的字符串再转成内存流:
var iniBuilder = new StringBuilder(); iniBuilder.AppendLine("[Settings]"); iniBuilder.AppendLine("accountId=1"); iniBuilder.AppendLine("singleMode=1"); // 其他Ini键值对... // 将字符串转成内存流 var iniStream = new MemoryStream(Encoding.UTF8.GetBytes(iniBuilder.ToString())); iniStream.Position = 0;
2. 将内存Ini流加入Zip归档
在你现有的Zip归档代码中,添加一个新的Zip条目,并将Ini内存流复制到该条目中:
修改后的完整代码:
var memoryStream = new MemoryStream(); var response = new HttpResponseMessage(HttpStatusCode.OK); var filepaths = Directory.GetFiles(setting.DirMicroSip); using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { // 原有逻辑:添加目录中的文件到Zip foreach(string filepath in filepaths) { string filename = Path.GetFileName(filepath); var entry = archive.CreateEntry(filename); using (var file = File.OpenRead(Path.Combine(setting.DirMicroSip, filename))) using (var entryStream = entry.Open()) { await file.CopyToAsync(entryStream); } } // 新增逻辑:添加内存中的Ini文件到Zip var iniEntry = archive.CreateEntry("MicroSIP_test.ini"); using (var entryStream = iniEntry.Open()) { await iniStream.CopyToAsync(entryStream); } } memoryStream.Position = 0; response.Content = new StreamContent(memoryStream); response.Content.Headers.ContentLength = memoryStream.Length; response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Archive.zip" }; response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip"); return response;
关键注意事项
- 确保
MemoryStream的Position重置为0,否则复制流时会从当前指针位置开始,导致内容缺失 - 使用
StreamWriter时设置leaveOpen: true,避免关闭写入器时同时关闭内存流 - 如果需要指定Ini文件的编码(比如GB2312),调整
Encoding参数即可
内容的提问来源于stack exchange,提问作者Vadim Tregubenko
相关产品推荐
相关产品推荐

