自动拉链过程有时会跳过文件

时间:2015-05-08 13:33:15

标签: c# zip 7zip

我的部分应用程序以一系列CSV文件导出数据,添加封面注释,然后将所有这些数据打包到受密码保护的zip文件中,随时可以发送。

这是执行压缩的相关代码。

private bool ZipFiles(string zipfile, string filename, string password)
{
    string arguments = string.Format(@"a -tzip ""{0}"" ""{1}"" -p{2}", zipfile, filename, password);

    ProcessStartInfo startInfo = new ProcessStartInfo(_zipExePath)
    {
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        ErrorDialog = false,
        Arguments = arguments,
        WindowStyle = ProcessWindowStyle.Hidden
    };

    try
    {
        Process.Start(startInfo);
    }
    catch (Exception ex)
    {
        Log.Error("Zip Process Failed", ex);
        return false;
    }

    return true;
}

它的名字是这样的:

string notePath = CreateNote(task);
string zipfile = _outputPath + "\\" task.TaskNumber + ".zip";
string filewildcard = _outputPath + "\\Data\\*.csv";

if (!ZipFiles(zipfile, filewildcard, task.Password) || !ZipFiles(zipfile, notePath, task.Password))
{
    Log.Error("Failed to created zip archive for Id " + task.TaskID);
    hasError = true;
}

大部分时间,这都没有问题。但是,这是一个间歇性问题,导致某些目标文件不会在归档中结束。大多数情况下,当发生这种情况时,会包含注释,但不会包含任何数据。很少,档案中不包含任何文件。

在失败的任务中似乎没有任何统一因素。有时,任务将无法生成正确的zip,然后在重置后,它可以再次运行并正确创建zip。

每当我尝试使用调试器逐步执行此代码来复制问题时,文件就会按预期进行压缩。我已经做了很多次,在调试器中,它似乎每次都没有错误。

如果文件不是全部​​压缩,则不会记录错误。

所以我认为这可能是一个时间问题 - 在磁盘完成输出数据之前,代码有效地进入了zip部分。我在生成数据的代码和我发布的代码之间添加了等待

Thread.Sleep(500);

那没有解决它。所以我做得越来越长。现在暂停了十分钟,这个问题仍然存在。

我对可能导致此问题的想法不以为然。有没有人有其他想法?

1 个答案:

答案 0 :(得分:2)

我认为问题可能是由此代码引起的:

if (!ZipFiles(zipfile, filewildcard, task.Password) || !ZipFiles(zipfile, notePath, task.Password))
{
    Log.Error("Failed to created zip archive for Id " + task.TaskID);
    hasError = true;
}

执行if语句时,它首先调用ZipFiles,它会立即返回 true 结果,然后再次调用ZipFilesif语句的第二个条件),以便您使用相同的zip文件名,几乎同时运行两个zip实用程序实例。他们可能正在踩着彼此的脚趾。

您可以尝试添加对Process.WaitForExit的调用,以确保第一个实例在开始第二个实例之前完成:

try
{
    Process p = Process.Start(startInfo);
    p.WaitForExit();
}
catch (Exception ex)
{
    Log.Error("Zip Process Failed", ex);
    return false;
}

此代码中的try/catch将不会捕获zip实用程序中发生的任何异常。它将捕获启动可执行文件时发生的任何异常。您可能希望检查p.ExitCode的值以查看该实用程序是否存在任何问题,如果有,请返回false