Necesita ayuda para abrir el archivo de sombra de spool de la impresora (.shd) que está bloqueado

StackOverflow https://stackoverflow.com/questions/7340882

  •  27-10-2019
  •  | 
  •  

Pregunta

Estoy interesado en alguna información dentro de un archivo de sombra (.shd) ubicado dentro del directorio de spooling de impresión de Windows "C: Windows System32 Spool Printers". Cada vez que se inicia un trabajo de impresión, se crean un archivo de carrete (.spl) y un archivo de sombra (.shd) en ese directorio. Hasta ahora he tenido éxito en detectar cuándo ha comenzado un trabajo impreso y he podido detener ese trabajo de impresión. Si no detiene el trabajo, los archivos eventualmente se dirigen a la impresora y luego son eliminados por Windows.

Mi problema es. No puedo abrir los archivos .shd porque están bloqueados de tal manera que no puede leerlos mientras están abiertos por la bobina de sprint. Incluso intenté ir al archivo en Windows Explorer y simplemente copiar el archivo a otro archivo, y eso tampoco funcionó. Sin embargo, los archivos de carrete .sPL que puedo abrir. Simplemente espero, y con bastante rapidez, el boteador lanza ese archivo. Sin embargo, para el archivo de sombra, se mantiene permanentemente en este archivo. Desafortunadamente, es el que necesito.

La línea de código que estoy usando específicamente para abrir el archivo es la siguiente:

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

La IoException que obtengo es:

El proceso no puede acceder al archivo 'c: windows system32 spool impresors fp00083.shd' porque está siendo utilizado por otro proceso.

Entonces, sí, está siendo utilizado por otro proceso. Está siendo utilizado por el servicio de bote de impresión de la ventana. Pero no creo que haya nada que pueda hacer al respecto. Todo lo que quiero hacer es leer el archivo. No quiero hacer ningún cambio. ¿Hay algo que pueda hacer aquí o simplemente estoy jodido?

¿Fue útil?

Solución 2

Bueno, no encontré una manera de evitar este problema. Sospecho que no hay solución para esto y es por diseño. Sin embargo, encontré otra forma de obtener la información que quería (al menos parece que hasta ahora).

Estoy usando la rutina FindNextPrinterChangeNotification () fuera de la biblioteca Winspool.DRV. Este tipo devuelve un puntero a una estructura de impresora_notify_info, que a su vez contiene una matriz de estructuras de impresora_notify_info_data. Dentro de esa matriz, hay un elemento con su miembro de "campo" marcado como "Job_Notify_Field_DevMode". Este elemento contiene una estructura bastante grande de tipo Devmode. La estructura se explica por M $ aquí http://msdn.microsoft.com/en-us/library/dd183565%28v=vs.85%29.aspx . Parece que esta estructura contiene lo que estoy buscando y aparentemente está envuelto en el archivo .shd de todos modos de todos modos según esta página http://www.undocprint.org/formats/winspool/shd. Me gustaría saber qué más hay en ese archivo .shd, pero aún no puedo abrirlo porque está bloqueado mientras el trabajo se detiene, y sospecho que permanece bloqueado hasta que el trabajo esté completo. Bueno, creo que mi nueva solución es más elegante de todos modos.

Otros consejos

Verifique la opción: "Mantenga documentos impresos"(Si tiene una impresora HP) y luego vea la carpeta de su archivo de carrete, tanto los archivos de sombra como de carrete estarían allí.

enter image description here

Solo asegúrese de detener el trabajo en el carrete tanto en su caja como en el servidor, entonces debería poder copiar/abrir/mover el archivo SHD como puede el archivo SPL. Funcionó para mí, de todos modos ...

Esto funciona para mí:
- Cuelgue la impresora (por ejemplo, mermelada del papel)
- Imprimir y observar .shd y .SPL se crean
- Stop Impresa Libradora
- Abre el archivo

El problema podría ser el parámetro FileShare.ReadWrite. Está pidiendo leer y escribir en el archivo y tal vez por eso recibe un error. Debería intentar pedir permiso de solo lectura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top