我有一个web api,可以创建2个临时PDF,合并它们,然后删除它们。问题是,在我的代码中,当它清理临时文件时,它告诉我它们正在被另一个进程使用。下面代码中的某些内容是保持文件打开,以便在调用此函数后,无法删除它们。对于我的生活,我无法弄清楚是什么。我已经尝试处理我能找到的任何资源并删除所有不同地方的文件,试图弄清楚它们是什么让它们打开,我想我已经将它缩小到f计数器递增后的if语句。我认为它不像读者被重新分配的方式。
public static bool MergeFiles(string destinationFile, string[] sourceFiles)
{
int f = 0;
var reader = new PdfReader(sourceFiles[f]);
int n = reader.NumberOfPages;
using (var fileStream = new FileStream(destinationFile, FileMode.Create, FileAccess.Write))
{
var document = new Document(reader.GetPageSizeWithRotation(1));
PdfWriter writer = PdfWriter.GetInstance(document, fileStream);
document.Open();
PdfContentByte cb = writer.DirectContent;
while (f < sourceFiles.Length)
{
int i = 0;
while (i < n)
{
i++;
document.SetPageSize(reader.GetPageSizeWithRotation(i));
document.NewPage();
PdfImportedPage page = writer.GetImportedPage(reader, i);
int rotation = reader.GetPageRotation(i);
if (rotation == 90 || rotation == 270)
{
cb.AddTemplate(page, 0, -1f, 1f, 0, 0,reader.GetPageSizeWithRotation(i).Height);
}
else
{
cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
}
}
f++;
if (f < sourceFiles.Length)
{
reader = new PdfReader(sourceFiles[f]);
n = reader.NumberOfPages;
}
}
document.Close();
writer.Dispose();
}
reader.Close();
reader.Dispose();
Log.Info(string.Format("Documents merged into: {0}", destinationFile));
return true;
}
稍后在代码中,使用以下命令删除文件:
File.Delete(tempCoverLetterFile);
FWIW:我发现,如果你把这段代码放在using
语句之上,它会删除一个文件,没问题:
reader.Dispose();
File.Delete(sourceFiles[0]);
我还发现,如果您在将读者重新分配给下一个pdf之前在reader.Dispose()
语句中添加if
,则可以正常运行。但是,合并的最终pdf已损坏且无法打开。
答案 0 :(得分:1)
如果f&lt; sourcefiles.length你打开一个新的阅读器。但是,你还没有关闭旧的。这会让你打开文件。
我希望在打开新阅读器之前你需要添加reader.close和reader.dispose(后者可能是可选的)