【发布时间】:2013-03-23 16:58:58
【问题描述】:
我已经广泛搜索了这个问题的答案。我知道为什么我会收到异常,但我无法在我的代码中找到它的原因。
基本上,我的代码创建了四个单独的 PDF 文件,将它们合并到一个大 PDF 文件中,然后删除原始的四个文件。一切都很好,除了我在尝试删除文件时收到 IOException,因为它们“正在被另一个进程使用”。
这是我用来合并文件的代码:
private static Document MergeFiles(string[] fileNames, string finalFileName)
{
Document doc = new Document(PageSize.A4, 20, 20, 25, 25);
if (fileNames.Length > 0)
{
int a = 0;
PdfReader reader = new PdfReader(fileNames[a]);
int n = reader.NumberOfPages;
FileStream output = new FileStream("C:\\temp\\" + finalFileName, FileMode.Create);
PdfWriter writer = PdfWriter.GetInstance(doc, output);
doc.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage page;
int rotation;
while (a < fileNames.Length)
{
int i = 0;
while (i < n)
{
i++;
doc.SetPageSize(reader.GetPageSizeWithRotation(i));
doc.NewPage();
page = writer.GetImportedPage(reader, i);
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);
}
a++;
if (a < fileNames.Length)
{
reader = new PdfReader(fileNames[a]);
n = reader.NumberOfPages;
}
}
}
doc.Close();
return doc;
}
这里是删除文件的代码:
private static void DeleteFile(string[] fileNames)
{
if (fileNames != null)
{
for (int x = 0; x < fileNames.Length; x++)
{
if(!fileNames[x].Equals(""))
System.IO.File.Delete(fileNames[x]);
}
}
}
任何帮助将不胜感激。当我合并文档时,我假设循环中的某个地方没有关闭(阅读器/作者),但我尝试了很多不同的组合,但似乎没有任何效果。真的开始烦我了。
更新 谢谢大家的cmets。我已将代码修改为:
private static Document MergeFiles(string[] fileNames, string finalFileName)
{
Document doc = new Document(PageSize.A4, 20, 20, 25, 25);
if (fileNames.Length > 0)
{
while (a < fileNames.Length)
{
using (PdfReader reader = new PdfReader(fileNames[a]))
using (FileStream output = new FileStream("C:\\temp\\" + finalFileName, FileMode.Create))
using (PdfWriter writer = PdfWriter.GetInstance(doc, output))
{
int n = reader.NumberOfPages;
doc.Open();
PdfContentByte cb = writer.DirectContent;
PdfImportedPage page;
int rotation;
int i = 0;
while (i < n)
{
i++;
doc.SetPageSize(reader.GetPageSizeWithRotation(i));
doc.NewPage();
page = writer.GetImportedPage(reader, i);
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);
}
a++;
if (a < fileNames.Length)
{
n = reader.NumberOfPages;
}
}
}
}
doc.Close();
return doc;
}
它可以编译,但在运行时出现错误,指向 Using 循环的右括号:
System.ObjectDisposedException was unhandled
Message=Cannot access a closed file.
【问题讨论】:
-
也许在 using 语句中实例化 PdfReader(fileName[a])?
-
一些建议:不要返回
Document对象,一旦关闭它就没有任何意义。要么返回一个成功的布尔值,文件名(可能不是因为你传入它),要么可能切换到MemoryStream并返回字节数组。如果您的原始四个文档足够小,我也会将它们分别创建为MemoryStream,并且只需使用字节数组即可。这样您就不必担心会撞到磁盘。 -
克里斯,我最终选择了您的解决方案并使用了 MemorySteam 和字节数组。它最终变得更快、更容易,没有与 PdfReaders 等相关的问题。感谢您的建议!
标签: c# pdf itextsharp ioexception delete-file