我对位于Windows打印假脱机目录“C:\ Windows \ System32 \ spool \ PRINTERS”内的影子文件(.shd)中的一些信息感兴趣。每次启动打印作业时,都会在该目录中创建假脱机文件(.spl)和影子文件(.shd)。到目前为止,我已成功检测到打印作业何时开始,并且能够暂停该打印作业。如果您不暂停作业,文件最终会进入打印机,然后被Windows删除。
我的问题是。我无法打开.SHD文件,因为它们被锁定的方式使得在sprint假脱机程序打开它们时无法读取它们。我甚至试图在Windows资源管理器中访问该文件,只是将文件复制到另一个文件,这也无效。我可以打开.SPL假脱机文件。我只是等待,并且相当快的假脱机程序释放该文件。但是对于影子文件,它永久保留在此文件中。不幸的是,它是我需要的那个。
我专门用于打开文件的代码行如下:
m_spoolJobStream = new FileStream(spoolFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
我得到的IOException是:
该进程无法访问文件'C:\ Windows \ system32 \ spool \ PRINTERS \ FP00083.SHD',因为它正由另一个进程使用。
是的,它被另一个进程使用。它被窗口的打印后台处理程序服务使用。但我认为我无能为力。我想要做的就是阅读文件。我不想对它做任何改动。我有什么可以做的,或者我只是搞砸了?
答案 0 :(得分:2)
答案 1 :(得分:1)
好吧,我找不到解决这个问题的方法。我怀疑没有解决方案,这是设计的。然而,我确实找到了另一种方法来获取我想要的信息(至少到目前为止似乎如此)。
我正在使用winspool.drv库中的FindNextPrinterChangeNotification()例程。这个人返回一个指向PRINTER_NOTIFY_INFO结构的指针,该结构又包含一个PRINTER_NOTIFY_INFO_DATA结构数组。在该数组中,有一个元素,其“Field”成员标记为“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文件中还有什么,但我仍然无法打开它,因为它在作业暂停时被锁定,我怀疑它在作业完成之前一直处于锁定状态。哦,我认为无论如何我的新解决方案更优雅。
答案 2 :(得分:0)
只需确保在您的盒子和服务器上暂停作业中的作业,然后您应该能够像spl文件一样复制/打开/移动shd文件。无论如何,为我工作......
答案 3 :(得分:0)
这对我有用:
- 挂起打印机(例如卡纸)
- 打印并观察.SHD和.SPL正在创建中
- 停止打印假脱机程序
- 打开文件
答案 4 :(得分:0)
问题可能是FileShare.ReadWrite参数。你要求读取和写入文件,这可能就是你收到错误的原因。你应该尝试要求获得只读权限。