有什么东西让我的文件打开

时间:2016-06-23 23:11:16

标签: c# pdf model-view-controller

我有一个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已损坏且无法打开。

1 个答案:

答案 0 :(得分:1)

如果f&lt; sourcefiles.length你打开一个新的阅读器。但是,你还没有关闭旧的。这会让你打开文件。

我希望在打开新阅读器之前你需要添加reader.close和reader.dispose(后者可能是可选的)