我试图从数百个文件生成一个可靠的存档,我将在后面压缩,但我尝试的所有内容似乎都遇到了问题。
要归档的文件正在我的程序中生成,我以Stream
s的形式访问它们。他们需要按照任何长度的路径进行组织。
目前我已将它们传递到7z.exe
的标准输入,我正在执行命令(请注意-mx0
,因为我不想在此步骤中压缩)
7z.exe a -t7z "file_out_path" -mx0 -si"internal_archive_path" < stream
使用以下代码
public static void Run(string exe, string args = null, System.IO.Stream stdin = null)
{
Process p = new Process();
p.StartInfo.UseShellExecute = false;
if (stdin != null)
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.FileName = exe;
if (args != null)
p.StartInfo.Arguments = args;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
p.Start();
if (stdin != null)
{
// stdin.CopyTo(p.StandardInput.BaseStream);
int readLen;
int buffSize = 4096;
byte[] buff = new byte[buffSize];
while (0 < (readLen = stdin.Read(buff, 0, buffSize)))
{
p.StandardInput.BaseStream.Write(buff, 0, readLen);
p.StandardInput.BaseStream.Flush();
}
p.StandardInput.Close();
}
p.WaitForExit();
}
// for loop
// make System.IO.Stream stream, etc
Run(bin7z, "a -t7z \"" + solid_archive_path + "\" -mx0 -si\"" + internal_archive_path + "\"", stream);
当它启动时似乎工作正常并生成所需的路径结构,但是当存档开始增加大小时,很明显每次我添加新文件时它都会复制整个归档到.tmp
。这是不可接受的,因为存档预计将增长到 ~3 GB 并包含数百个文件,这意味着当前行为会导致数百个 GB 被一遍又一遍地复制复制比任何其他步骤都要长得多。
如何防止此行为?我对其他存档解决方案持开放态度。
之前我曾尝试使用tar-cs
,但只要使用internal_archive_path.Length > 100
容器格式并不重要,只要它没有被压缩,我可以稍后在我想要反向时从中提取文件。
< / LI>我的环境仅设置为编译C#
答案 0 :(得分:0)
您可以将文件复制到具有所需路径结构的新临时目录,而不是运行7z来创建未压缩的7zip文件。
复制完所有文件后,运行7z命令从temp目录创建压缩/未压缩的7z存档,最后清除临时目录。