none
WriteFile/ReadFileのlpNumberOfBytesWritten RRS feed

  • 質問

  • お世話になります。

    WriteFile/ReadFile APIにはlpNumberOfBytesWrittenという引数があり、実際に読み書きしたバイト数が
    取得できますが.......

    lpOverlapped=NULL
    ・WriteFile/ReadFileの戻り値は成功をあらわしている(!0)。

    のとき、この引数の値が要求したバイト数(nNumberOfBytesToWrite)と異なることはありえるのでしょうか?
    (=読みきれず、書ききれずの状態?)

    自分で実装するときには、戻り値のチェックの後に、値の比較処理を入れることがありますが、
    そこでトラップされたことが未だかつてなく、成功時は常に同一になるような気はするのですが、確証がありません。

    異なることがありえるとすれば、それはどのような場合でしょうか?

    よろしくお願いします。

    #書いたあとに思いましたが、読みきれずは、要求サイズよりファイルサイズが小さかったときにありそうですね...(未確認)。
    • 編集済み MAGMAG 2009年6月1日 9:35
    2009年6月1日 9:31

回答

  • #書いたあとに思いましたが、読みきれずは、要求サイズよりファイルサイズが小さかったときにありそうですね...(未確認)。
    一定サイズのバッファを使って読み込みをしている場合に、ファイルサイズがバッファサイズの整数倍ちょうどでなければ容易に起こりますよ。
    限られたメモリしか使えないような状況で大きなファイルを取り扱う場合には普通にありえます。
    あと、これらの関数に関しては非同期の動作も考慮されて設計されていますから、そっちで意味があるケースもあると思います。


    解決した時は、参考になったレスポンスの所にある[回答済み]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク MAGMAG 2009年6月4日 6:39
    2009年6月4日 1:46

すべての返信

  • WriteFile Function に普通に例が挙がっています。
    When writing to a nonblocking, byte-mode pipe handle with insufficient buffer space, WriteFile returns TRUE with *lpNumberOfBytesWritten < nNumberOfBytesToWrite .
    対策としてはもちろん、書き込まれていない残りバイトを適切なタイミングで再度書き込むことでしょう。ReadFileも同じで、途中までしか読み込まれていませんので読み直すことになるかと。
    2009年6月1日 10:58
  • #書いたあとに思いましたが、読みきれずは、要求サイズよりファイルサイズが小さかったときにありそうですね...(未確認)。
    一定サイズのバッファを使って読み込みをしている場合に、ファイルサイズがバッファサイズの整数倍ちょうどでなければ容易に起こりますよ。
    限られたメモリしか使えないような状況で大きなファイルを取り扱う場合には普通にありえます。
    あと、これらの関数に関しては非同期の動作も考慮されて設計されていますから、そっちで意味があるケースもあると思います。


    解決した時は、参考になったレスポンスの所にある[回答済み]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク MAGMAG 2009年6月4日 6:39
    2009年6月4日 1:46
  • みなさんありがとうございました。


    magmagg
    2009年6月4日 6:16