【问题标题】:How do I find the spool file for the job with a given ID even when spool file pooling is enabled?即使启用了假脱机文件池,如何找到具有给定 ID 的作业的假脱机文件?
【发布时间】:2018-08-21 15:01:00
【问题描述】:

我想将给定 Windows 打印作业的假脱机数据复制到磁盘上的任意位置。

我有来自Print Spooler API 的打印作业的作业 ID。我知道这项工作已经完成了假脱机。我知道在我有时间完成我需要做的任何事情之前,该工作不会被删除。

如果文件池被禁用,我可以通过在假脱机目录中查找格式为“xxxxx.spl”的文件来执行此操作,其中 xxxxx 是填充为 0 的作业 ID。

如果启用了文件池,我该怎么做?

如果有一种方法可以获取作业 ID 并返回假脱机数据流,我会很高兴,但目前这似乎不太可能。据推测,使用OpenPrinter 和“PrinterName,Job xxxx”和 ReadPrinter 可能会发生类似的事情,如文档中的here,但到目前为止我haven't been able to get it to work,即使我这样做,它看起来也将数据加载到内存中,我'不确定这将如何处理大型假脱机文件(>1 GB 并不罕见)。

我的第二个偏好是传入 ID 并通过磁盘上的假脱机数据取回文件的位置(无论文件池设置如何)。

我的第三个偏好是将池文件(“FPyyyyy.spl”)映射到它的作业 ID。

这些是否可行,或者是否有人对如何解决这个问题有更好的想法?

(编辑添加,因为不清楚我们是否知道此选项): 我们的后备方案是要求我们的客户通过编辑每台打印机的注册表来禁用假脱机文件池,但我们更希望避免这种情况。

【问题讨论】:

  • 嗨,“你怎么知道在你有时间完成你需要做的任何事情之前,工作不会被删除。”?如何保留假脱机文件?

标签: c# windows print-spooler-api


【解决方案1】:

figured out 为什么我对OpenPrinter 的调用失败了,我已经使用OpenPrinterReadPrinter 成功读取了假脱机数据,这很好地解决了我们的问题。

不过,我仍会将赏金奖励给提出更好解决方案的任何人。

【讨论】:

    【解决方案2】:

    你读过这个吗?

    http://www.undocprint.org/winspool/spool_files

    它似乎有你需要的一切:)

    特别是To Turn Off Spool File Pooling on a Per Printer Queue-Basis

    也有这篇关于假脱机文件格式的文章http://www.codeproject.com/Articles/9720/The-Windows-NT-print-spool-shadow-file-format 但是,您似乎已经知道格式,它可能不会有任何帮助。

    【讨论】:

    • 是的,我已经阅读了该页面。我们希望在不禁用假脱机文件池的情况下访问假脱机数据。我们希望避免强迫我们的客户为他们创建的每台打印机(或尝试为他们这样做)编辑注册表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2010-10-13
    相关资源
    最近更新 更多