C# 无法访问该文件,因为其他进程正在使用该文件

C# 无法访问该文件,因为其他进程正在使用该文件,c#,asp.net,itextsharp,pdfstamper,C#,Asp.net,Itextsharp,Pdfstamper,“我的web方法”在我的%temp%文件夹中创建一个pdf文件,并且可以正常工作。然后,我想使用下面的代码向该文件添加一些自定义字段(meta) 类PdfStamper生成一个IOException,无论我使用它的.Close()方法还是using块刚刚结束。仍然保留文件句柄的进程是WebDevWeb服务器本身(我正在VS2010SP1中调试) private string AddCustomMetaData(字符串guid、int companyID、字符串文件路径) { 尝试 { PdfRe

“我的web方法”在我的%temp%文件夹中创建一个pdf文件,并且可以正常工作。然后,我想使用下面的代码向该文件添加一些自定义字段(meta)

PdfStamper
生成一个
IOException
,无论我使用它的
.Close()
方法还是
using
块刚刚结束。仍然保留文件句柄的进程是WebDevWeb服务器本身(我正在VS2010SP1中调试)

private string AddCustomMetaData(字符串guid、int companyID、字符串文件路径)
{
尝试
{
PdfReader reader=新的PdfReader(文件路径);
使用(FileStream fs=newfilestream(filePath,FileMode.Open,FileAccess.ReadWrite,FileShare.ReadWrite))
{
PdfStamper st=新的PdfStamper(读卡器,fs);
字典信息=reader.info;
信息添加(“Guid”,Guid);
info.Add(“CompanyID”,CompanyID.ToString());
st.MoreInfo=info;
圣克洛斯();
}
reader.Close();
返回guid;
}
捕获(例外e)
{
返回e.消息;
}
}
无论我尝试什么,它总是在
st.Close()处抛出异常,更准确地说:

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

要么我忽略了一些明显的问题,要么是我还不知道的
PdfStamper
类有问题。使用的itextsharp版本为5.3.3.0和5.4.0.0,问题相同

如有任何见解,将不胜感激


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

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

我建议您在打开文件时使用
文件共享枚举器,因此,尝试打开一个
无共享的文件

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

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

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

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

那是我力所不及的。web服务调用接受文件路径的ActiveX dll。我无法控制第一次写入操作。在pdf阅读器打开该文件之前,您确定该文件未被使用吗?(正如在此之前您对该文件所做的)更好的是,尝试在
pdf阅读器
之前切换文件打开顺序(
filestream
)是的,但这并不能解释这个问题的原因。我已经寻找这个解决方案好几个小时了。很好用!
PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath));