0

我对位于 Windows 打印假脱机目录“C:\Windows\System32\spool\PRINTERS”内的影子文件 (.shd) 中的一些信息感兴趣。每次启动打印作业时,都会在该目录中创建一个假脱机文件 (.spl) 和一个影子文件 (.shd)。到目前为止,我已经成功检测到打印作业何时开始,并且能够暂停该打印作业。如果您不暂停作业,文件最终会进入打印机,然后被 Windows 删除。

我的问题是。我无法打开 .SHD 文件,因为它们被锁定,当它们被 sprint spooler 打开时您无法读取它们。我什至尝试在 Windows 资源管理器中访问该文件,然后将文件复制到另一个文件,但这也不起作用。我可以打开的 .SPL 假脱机文件。我只是等待,并且后台处理程序很快就会释放该文件。但是,对于影子文件,它会永久保留该文件。不幸的是,它是我需要的。

我专门用来打开文件的代码行如下:

m_spoolJobStream = new FileStream(spoolFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

我得到的 IOException 是:

该进程无法访问文件“C:\Windows\system32\spool\PRINTERS\FP00083.SHD”,因为它正被另一个进程使用。

所以是的,它正在被另一个进程使用。它被窗口的打印后台处理程序服务使用。但我认为我对此无能为力。我要做的就是读取文件。我不想对其进行任何更改。有什么我可以在这里做的还是我只是搞砸了?

4

5 回答 5

2

检查选项:“保留打印的文档”(如果您有 HP 打印机)然后查看您的假脱机文件夹,影子和假脱机文件都会在那里。

在此处输入图像描述

于 2016-07-25T06:18:59.217 回答
1

好吧,我没有找到解决这个问题的方法。我怀疑没有解决方案,这是设计使然。但是我确实找到了另一种方法来获取我想要的信息(至少到目前为止看起来如此)。

我正在使用 winspool.drv 库中的 FindNextPrinterChangeNotification() 例程。这家伙返回一个指向 PRINTER_NOTIFY_INFO 结构的指针,该结构又包含一个 PRINTER_NOTIFY_INFO_DATA 结构数组。在该数组中,有一个元素的“字段”成员标记为“JOB_NOTIFY_FIELD_DEVMODE”。此元素包含一个相当大的 DEVMODE 类型的结构。该结构由此处的 M$ 解释http://msdn.microsoft.com/en-us/library/dd183565%28v=vs.85%29.aspx根据此页面http://www.undocprint.org/formats/winspool/shd,此结构看起来包含我正在寻找的内容,并且显然包含在 .SHD 文件中. 我想知道那个 .SHD 文件中还有什么,但我仍然无法打开它,因为它在作业暂停时被锁定,我怀疑它在作业完成之前一直处于锁定状态。哦,好吧,无论如何,我认为我的新解决方案更优雅。

于 2011-09-08T17:29:14.783 回答
0

只要确保你在你的盒子和服务器上都暂停了 spool 中的作业,那么你应该能够像 spl 文件一样复制/打开/移动 shd 文件。无论如何,为我工作...

于 2011-09-23T01:02:37.867 回答
0

这对我有用:
- 挂起你的打印机(例如卡纸)
- 打印并观察正在创建的 .SHD 和 .SPL
- 停止打印后台处理程序
- 打开文件

于 2012-12-26T08:53:29.307 回答
0

问题可能是 FileShare.ReadWrite 参数。您要求在文件上读写,也许这就是您收到错误的原因。您应该尝试请求只读权限。

于 2013-11-11T14:25:57.267 回答