0

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' にアクセスできません。

はい、別のプロセスで使用されています。ウィンドウの印刷スプーラ サービスによって使用されています。しかし、それについて私にできることは何もないと思います。私がしたいのは、ファイルを読むことだけです。私はそれを変更したくありません。ここで私にできることはありますか?

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」としてマークされた「Field」メンバーを持つ要素があります。この要素には、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

これは私にとってはうまくいき
ます:-プリンタをハングアップします(たとえば、紙を詰まらせます)
-作成中の.SHDと.SPLを印刷して観察します-
印刷スプーラを停止
します-ファイルを開きます

于 2012-12-26T08:53:29.307 に答える
0

問題は、FileShare.ReadWrite パラメーターにある可能性があります。ファイルの読み取りと書き込みを要求しているため、エラーが発生する可能性があります。読み取り専用の許可を求めてみてください。

于 2013-11-11T14:25:57.267 に答える
0

ボックスとサーバーの両方のスプールでジョブを一時停止することを確認してください。そうすれば、spl ファイルと同じように、shd ファイルをコピー/開く/移動できるはずです。とにかく、私のために働いた...

于 2011-09-23T01:02:37.867 に答える