【问题标题】:Cannot access the file because it is being used by another process无法访问该文件,因为它正被另一个进程使用
【发布时间】:2013-03-15 02:46:51
【问题描述】:

我的网络方法在我的 %temp% 文件夹中创建了一个 pdf 文件,并且该文件有效。然后我想使用下面的代码向该文件添加一些自定义字段(元)。

PdfStamper 类生成一个IOException,无论我使用它的.Close() 方法还是using 块刚刚结束。仍然持有文件句柄的进程是 webdev web 服务器本身(我在 VS2010 SP1 中调试)。

private string AddCustomMetaData(string guid, int companyID, string filePath)
{
    try
    {
        PdfReader reader = new PdfReader(filePath);

        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
        {
            PdfStamper st = new PdfStamper(reader, fs);
            Dictionary<string, string> info = reader.Info;
            info.Add("Guid", guid);
            info.Add("CompanyID", companyID.ToString());

            st.MoreInfo = info;
            st.Close();
        }

        reader.Close();

        return guid;
    }
    catch (Exception e)
    {
        return e.Message;
    }
}

无论我尝试什么,它都会在st.Close(); 处抛出异常,更准确地说:

进程无法访问文件'C:\Users[my 用户名]\AppData\Local\Temp\53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf' 因为它正被另一个进程使用。

要么我忽略了一些明显的事情,要么我尚未意识到 PdfStamper 类存在问题。使用的itextsharp版本是5.3.3.0和5.4.0.0,问题是一样的。

任何见解将不胜感激。

编辑:我目前正在“编码”这个问题,但我还没有找到任何解决方案。

【问题讨论】:

  • 您确定该文件在 pdf 阅读器打开之前没有被使用吗? (就像在此之前你对这个文件做了什么)
  • 更好的是,尝试切换文件打开的顺序 (filestream before pdf reader)

标签: c# asp.net itextsharp pdfstamper


【解决方案1】:

您的问题是您在写入文件的同时也在读取文件。与将所有数据“加载”到内存中的某些文件类型(JPG、PNG 等)不同,iTextSharp 将数据作为流读取。您要么需要使用两个文件并在最后交换它们,要么可以通过将 PdfReader 绑定到文件的字节数组来强制 iTextSharp“加载”第一个文件。

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));

【讨论】:

  • 我一直在寻找这个解决方案几个小时。完美运行!
【解决方案2】:

我建议你在打开文件时使用FileShare enumerator,所以请尝试使用None sharing打开文件

   File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);

【讨论】:

    【解决方案3】:

    当您第一次保存文件时,尝试 .Dispose() 您的 PDF 阅读器(或用于创建它的任何工具)

    【讨论】:

    • 这超出了我的能力范围。 Web 服务调用一个接受文件路径的 ActiveX dll。第一个写操作不在我的控制范围内。
    【解决方案4】:

    如果您认为它对您可行,请尝试此解决方案 - 一旦 web 方法在 Temp 文件夹中创建文件,您需要复制文件并将其粘贴到其他位置或具有不同名称的相同位置,并将新复制的文件路径传递给您的 PDF读者。

    【讨论】:

    • 是的,但这并不能解释这个问题的原因是什么
    猜你喜欢
    • 2010-12-10
    相关资源
    最近更新 更多