1

私はこの質問への答えを広範囲に検索しました。例外を受け取った理由はわかっていますが、コードでその原因を見つけることができません。

基本的に、私のコードは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.
4

2 に答える 2

4

リソースを破棄ていません。

PdfReaderPdfWriter、およびFileStreamすべて実装しIDisposableます。これらはすべてDisposedにするか、usingブロックにラップする必要があります (後者が望ましい)。

私の推測では、PdfReaderこれらのファイルを開いたままにしているインスタンスです。

PSメソッドの最後にあるだけでは十分ではありませんClose。これらの呼び出しが実行される前に例外が発生した場合、それらは「永久に」(またはプロセスが実行されている限り)開いたままになります。クリーンアップをブロックに入れるかfinally、単に使用してくださいusing

于 2013-03-23T17:07:30.100 に答える
0

ドキュメント ( doc.Close();) を閉じていますが、ファイル ストリーム、ライター、およびリーダーを閉じていません。

これを後に追加しますdoc.Close();

writer.Close();
output.Close();
reader.Close();
于 2013-03-23T17:03:49.163 に答える