因为它正被另一个进程无法访问该文件(Cannot access the file because i

2019-07-23 06:30发布

我的Web方法在我的%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:\用户[我的名] \ AppData \本地的\ Temp \ 53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf”,因为它正由另一个进程使用。

要么我俯瞰一些明显或有与问题PdfStamper类,我还没有意识到的。 使用iTextSharp的版本是5.3.3.0和5.4.0.0,这个问题是一样的。

任何有识之士将不胜感激。

编辑:我目前“编码周围”的问题,但我还没有找到任何解决办法。

Answer 1:

你的问题是,你正在写一个文件,而你也从中读取。 不像某些文件类型(JPG,PNG,等)的“负载”的全部数据存入存储器的,iTextSharp的读取数据作为流。 你要么需要使用两个文件,并在年底交换它们也可以通过你的约束力iTextSharp的“装入”的第一个文件PdfReader到文件的字节数组。

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


Answer 2:

我建议你使用FileShare enumerator当你打开文件,所以尝试打开一个文件None sharing

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


Answer 3:

尝试.Dispose()您的PDF阅读器(或任何你用来创建它)当您保存文件首次



Answer 4:

如果你认为它是可行的,你尝试这种解决方案 - 一旦将WebMethod在Temp文件夹中创建的文件,你需要复制该文件,并将其与不同的名称粘贴到其他位置或相同的位置,并通过新复制的文件路径您的PDF阅读器。



文章来源: Cannot access the file because it is being used by another process