我的部分应用程序以一系列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);
那没有解决它。所以我做得越来越长。现在暂停了十分钟,这个问题仍然存在。
我对可能导致此问题的想法不以为然。有没有人有其他想法?
答案 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 结果,然后再次调用ZipFiles
( if
语句的第二个条件),以便您使用相同的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
。