Нужна помощь в открытии файла теневого каталога принтера (.SHD), который заблокирован - PullRequest
0 голосов
/ 08 сентября 2011

Меня интересует некоторая информация в теневом файле (.shd), расположенном внутри каталога буферизации печати Windows "C: \ Windows \ System32 \ spool \ PRINTERS". При каждом запуске задания на печать в этом каталоге создаются буферный файл (.spl) и теневой файл (.shd). До сих пор я успешно определял, когда началось задание на печать, и смог приостановить это задание. Если вы не приостановите работу, файлы в конечном итоге попадут на принтер, а затем будут удалены окнами.

Моя проблема в том. Я не могу открыть файлы .SHD, потому что они заблокированы таким образом, что вы не сможете прочитать их, пока они открываются спулером спринта. Я даже пытался перейти к файлу в проводнике Windows и просто скопировать файл в другой файл, и это тоже не сработало. Файлы спулинга .SPL, которые я могу открыть, хотя. Я просто жду, и довольно быстро спулер выпускает этот файл. Для теневого файла он постоянно сохраняется в этом файле. К сожалению, это то, что мне нужно.

Строка кода, которую я специально использую для открытия файла, выглядит следующим образом:

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

IOException, которое я получаю:

Процесс не может получить доступ к файлу 'C: \ Windows \ system32 \ spool \ PRINTERS \ FP00083.SHD', так как он используется другим процессом.

Так что да, он используется другим процессом. Он используется службой очереди печати окна. Но я не думаю, что могу что-то сделать с этим. Все, что я хочу сделать, это прочитать файл. Я не хочу вносить в него какие-либо изменения. Я могу здесь что-нибудь сделать или я просто облажался?

Ответы [ 5 ]

2 голосов
/ 25 июля 2016

Установите флажок: « Сохранить распечатанные документы » (если у вас есть принтер HP), а затем просмотрите папку файлов спула, там будут и теневые, и файлы спула.

enter image description here

1 голос
/ 08 сентября 2011

Ну, я не нашел пути решения этой проблемы. Я подозреваю, что нет никакого решения для этого, и это разработано. Однако я нашел другой способ получить нужную информацию (по крайней мере, пока).

Я использую процедуру FindNextPrinterChangeNotification () из библиотеки winspool.drv. Этот парень возвращает указатель на структуру 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. Эта структура выглядит так, как будто она содержит то, что я ищу, и, по-видимому, в любом случае обернута в файл .SHD согласно этой странице http://www.undocprint.org/formats/winspool/shd. Я хотел бы знать, что еще находится в этом файле .SHD, но я все еще не могу открыть его, потому что он заблокирован, пока задание приостановлено, и я подозреваю, что он остается заблокированным до завершения задания. О, хорошо, я думаю, что мое новое решение в любом случае более элегантно.

0 голосов
/ 11 ноября 2013

Возможно, проблема в параметре FileShare.ReadWrite. Вы просите прочитать и написать файл, и, возможно, именно поэтому вы получаете ошибку. Вы должны попробовать запросить разрешение только для чтения.

0 голосов
/ 26 декабря 2012

Это работает для меня:
- Повесьте принтер (например, закройте бумагу)
- Распечатайте и наблюдайте .SHD и .SPL создаются
- Остановить спулер печати
- Откройте файл

0 голосов
/ 23 сентября 2011

Просто убедитесь, что вы приостановили работу в спуле ОБА и вашей коробки и сервера, тогда вы сможете копировать / открывать / перемещать файл shd точно так же, как и файл spl. Во всяком случае, работал на меня ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...