【问题标题】:C# - Cannot access a closed streamC# - 无法访问关闭的流
【发布时间】:2021-01-08 07:12:59
【问题描述】:

我使用 iTextSharp 5.5.13.2 版创建 PDF 的代码返回错误“无法访问已关闭的流”。 我不确定这个错误是如何出现的,因为我将我的代码封装在 Using 语句的范围内。调试导致应用程序进入中断状态。 PdfWriter writer = PdfWriter.GetInstance(doc, ms);

【问题讨论】:

  • 是哪行代码导致的。
  • 您使用的是哪个版本的 iTextSharp? (PS 你也应该明确提到你在你的问题/标签中使用 iTextSharp)
  • 造成这种情况的典型原因是流被流的某些用户处置,可能是 pdfwriter 或文档。有些类采用“keepOpen”参数来避免这种行为。
  • 查看源代码here 它会关闭os(输出流,PdfWriter.GetInstance 中的ms 参数),具体取决于closeStream 是真还是假。碰巧closeStream 是一个属性。所以你需要做的就是在GetInstance之后设置writer.CloseStream = false;

标签: c# stream itext filestream memorystream


【解决方案1】:

查看(已弃用)iTextSharp 5.5.13.2 here 的源代码,我可以找到 DocWriterPdfWriter 的基类)的源代码,它是 Close 方法 here

public virtual void Close() {
    open = false;
    os.Flush();
    if (closeStream)
        os.Close();
}

os 在这种情况下是作为第二个参数传递给PdfWriter.GetInstance (在你的情况下是ms)。使用 Ctrl + F 我可以找到 closeStream 的来源,这恰好是一个属性公开为 CloseStream here

public virtual bool CloseStream {
    get {
        return closeStream;
    }
    set {
        closeStream = value;
    }
}

Close 一起被DocWriterDispose method 自动调用

public virtual void Dispose() {
    Close();
}

因此,如果您不希望 PdfWriter 关闭您的 ms,则需要在您的 PdfWriter 关闭之前设置 writer.CloseStream = false;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2011-12-27
    • 2012-06-11
    • 2021-12-21
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多