私はこの質問への答えを広範囲に検索しました。例外を受け取った理由はわかっていますが、コードでその原因を見つけることができません。
基本的に、私のコードは4つの別々のPDFファイルを作成し、それらを大きなPDFファイルに結合してから、元の4つのファイルを削除します。ファイルが「別のプロセスによって使用されている」ためにファイルを削除しようとすると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]);
}
}
}
どんな援助でも大歓迎です。ドキュメントをマージしているとき、ループのどこかで何かが閉じられていないと思います(リーダー/ライター)が、さまざまなコンボを試しましたが、何も機能しないようです。それは本当に私を苛立たせ始めています。
更新 皆さん、コメントありがとうございます。私はこれに私のコードを修正しました:
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.