即使启用了假脱机文件池,如何找到具有给定ID的作业的假脱机文件?

时间:2012-10-12 20:36:04

标签: c# windows print-spooler-api

我想将给定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。

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

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

2 个答案:

答案 0 :(得分:8)

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

我仍然会向那些提出更好解决方案的人颁发赏金。

答案 1 :(得分:1)

你读过这个吗?

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的格式的文章但是看起来你已经知道格式了,它可能没有任何帮助。