FileStream.Lengthがlong型であるのに、FileStream.Read引数-offsetの長さintが短いのはなぜですか?
ブライアン
オフセットは、データが配置されるバイト配列へのインデックスです。2 GBを超えるアレイを割り当てることはできないため、オフセットにこれより大きな数を割り当てる必要はありません。
このoffset
パラメーターは、配列内のデータの書き込みを開始する場所、array
パラメーターを示します。ファイルデータのオフセットを示すものではありません。
offsetパラメーターは、読み取りを開始する配列内のバイトのオフセット(バッファー・インデックス)を示し、countパラメーターは、このストリームから読み取られる最大バイト数を示します。戻り値は、実際に読み取られたバイト数、またはストリームの終わりに達した場合はゼロです。読み取り操作が成功すると、ストリームの現在の位置が読み取られたバイト数だけ進みます。例外が発生した場合、ストリームの現在の位置は変更されません。
ソース:FileStream.Read
FileStream.Lengthはストリームのバイト単位の長さを取得し、FileStream.Readはストリームからバイトのブロックを読み取ります。したがって、論理的には、そのバイトのブロックよりも多くの単一バイトがあります。このため、FileStream.Lengthには長い型が必要だと思います。
mike zの回答に加えて、byte []にint.MaxValueを超えてインデックスを付けることができない理由-クラスArrayはobject this[int index] { get; set; }
メソッドを使用してIListを実装するため、インデックスは整数のみにすることができます。
基本クラスからオーバーライドされるこのメソッドを参照していると想定していますStream
。
array
オフセットは、の先頭からのオフセットではなく、バイトを配置する引数内の位置FileStream
です。array
引数は、要素をbyte[]
超えることはできない型です。int.MaxValue
ストリームを拡張するFileStream、
Streamは、byte [int.MaxValue]配列の数を処理でき、それらを合わせると長さが長くなります。
ただし、Readを使用すると、int.MaxValueを使用してその一部のみをバイト配列に読み取ることができます。
ディスクから2G=int.MaxValueより大きいファイルを読み取る場合は、byte[int.MaxValue]のチャンクで読み取る必要があることを考慮してください。
(: