使用生成的文件

时间:2015-07-11 21:19:43

标签: c# 7zip

我试图从数百个文件生成一个可靠的存档,我将在后面压缩,但我尝试的所有内容似乎都遇到了问题。

要归档的文件正在我的程序中生成,我以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#

1 个答案:

答案 0 :(得分:0)

您可以将文件复制到具有所需路径结构的新临时目录,而不是运行7z来创建未压缩的7zip文件。

复制完所有文件后,运行7z命令从temp目录创建压缩/未压缩的7z存档,最后清除临时目录。