プリンターに直接情報を送信するために使用できるプリンター ヘルパー クラスを継承しました。ファイル、文字列、または raw バイトを処理できます。ファイルと文字列の場合、最初にそれらをバイトに変換し、bytes メソッドを使用して送信します。
私の問題は、file メソッドが、bytes メソッドが成功するために必要なすべての変数を設定できていないことです。以下の方法を参照してください。
// Open the file.
FileStream fs = new FileStream(szFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// Create a BinaryReader on the file.
BinaryReader br = new BinaryReader(fs);
// Dim an array of bytes big enough to hold the file's contents.
Byte[] bytes = new Byte[fs.Length];
bool bSuccess = false;
// Your unmanaged pointer.
IntPtr pUnmanagedBytes = new IntPtr(0);
int nLength;
nLength = Convert.ToInt32(fs.Length);
// Read the contents of the file into the array.
bytes = br.ReadBytes(nLength);
// Allocate some unmanaged memory for those bytes.
pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
// Copy the managed byte array into the unmanaged array.
Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
// Send the unmanaged bytes to the printer.
bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
// Free the unmanaged memory that you allocated earlier.
Marshal.FreeCoTaskMem(pUnmanagedBytes);
return bSuccess;
ストリーム自体にはすべて正しいデータがあるにもかかわらず、障害点はnLength = Convert.ToInt32(fs.length);
として出てきているようです。0
その時点でブレークポイントを設定すると、常に機能します。SendBytesToPrinter
呼び出し時に下に置くと、 にnLength
なります0
。
今の私の回避策はThread.Sleep(1000);
、変換の直前に使用することですが、それは私の好みにはハックすぎます。
この問題を引き起こしている FileStream の特性はありますか、それともここのコードに何か問題がありますか?
編集:long
何かを明確にするために、私は aとの違いを完全に認識していint
ます。使用されるファイルは、これで問題を引き起こしません。一時停止の有無にかかわらず、同じファイルを何十回も実行できますが、一時停止なしでは常に失敗します。
編集 #2: Brandon の回答は問題を直接解決しませんでしたが、ファイルを操作する新しいアプローチにより、最初にファイルを取得するために使用されるダウンロード方法の問題が明らかになりました。私は彼の答えを受け入れたものとしてマークしています。なぜなら、それは私を本当の問題に導いただけでなく、一般的にメソッドを処理するよりクリーンな方法だからです。