为什么这段代码有时会在PDF生成过程中拒绝访问?

时间:2013-07-08 20:54:30

标签: c#

我偶尔会收到以下错误,很少:

Access to the path 'e:\Batch\CR\data_Test\IM_0232\rdlcTemp\RN837102.ZM\MemberEOB_1.pdf' is denied.

发生错误的确切代码块如下所示。此错误仅偶尔发生且很少发生。如果我们重新启动服务器并尝试再次运行相同的输入文件,我们会发现错误不再发生 - 但并非总是如此。此代码处于循环中,在一次运行应用程序时最多可执行5000次。我们发现错误可能发生在运行中的任何一点 - 将创建100个PDF文件而没有任何问题,然后会发生此错误。我们为什么会收到此错误?

相关代码:

byte[] bytes = report.Render("PDF", deviceInfo);
FileStream fs = new FileStream(@savePath + ".pdf", FileMode.Create);
fs.Write(bytes, 0, bytes.Length);
fs.Close();
fs.Dispose();

3 个答案:

答案 0 :(得分:1)

输入/输出过程是否可靠,以至于创建PDF文件的设备繁忙?检查事件查看器以查看是否有相关内容报告

并没有什么坏处

答案 1 :(得分:0)

  1. 从路径e:\ Batch \ CR \ data_Test \ IM_0232 \ rdlcTemp \ RN837102.ZM \
  2. 导航至rdlcTemp
  3. 右键单击RN837102.ZM文件夹
  4. 点击“属性” - >“安全性”
  5. 确保为当前帐户用户
  6. 检查此文件的写入权限
  7. 如果未选中,请单击“编辑并启用写入权限”
  8. 应用更改
  9. 希望这个帮助

答案 2 :(得分:0)

由于这还没有解决,这里是我建议的相关代码:

static object staticSyncObject = new object();  // in class level fields
// ... 
foreach( string savePath in paths )
{
    byte[] bytes = report.Render("PDF", deviceInfo);
    lock(staticSyncObject) // synchronized() was java, ideally would time out
    {
        using(FileStream fs = new FileStream(@savePath+".pdf", FileMode.Create))
        {
            fs.Write(bytes, 0, bytes.Length);
        }
    }
}

在异常处理代码中:

} catch (Exception ex) {
    Console.WriteLine("" + ex);

    System.Diagnostics.Process p = new System.Diagnostics.Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.FileName = "handle.exe";
    p.StartInfo.Arguments = "C:\\path_to_pdfs";
    p.Start();

    int ch;
    while ((ch = p.StandardOutput.Read()) != -1)
        Console.Write((char)ch);
}