2011-08-18 18 views
5

FileStream.Read()は次のように定義されています:FileStreamは、大きなファイルからデータを読み込みます。 intより大きいファイルサイズ。オフセットの設定方法は?

public override int Read(
    byte[] array, 
    int offset, 
    int count 
) 

int.MaxValueより大きなオフセットからいくつかのバイトを読み取るにはどうすればよいですか?

非常に大きなファイルがあり、3147483648の位置から100MBを読みたいとしましょう。

どうすればいいですか?

答えて

11

offsetは、のオフセットであり、ここで書き込みを開始します。あなたの場合、次のように設定してください:

stream.Position = 3147483648; 

Read()を使用してください。あなたが読む必要が知っているときoffsetは、最も一般的に使用されている[n]はバイト:

int toRead = 20, bytesRead; 
while(toRead > 0 && (bytesRead = stream.Read(buffer, offset, toRead)) > 0) 
{ 
    toRead -= bytesRead; 
    offset += bytesRead; 
} 
if(toRead > 0) throw new EndOfStreamException(); 

これはbufferに正確に20のバイトを読んで(または例外をスロー)します。 Read()は、必要なすべてのデータを一度に読み取ることが保証されていないので、通常はオフセットを増やすループが必要です。

+0

を参照してくださいしかし、どのようなオフセットが起こることはint.MaxValue以上になりますか?あなたはそれをどのように扱いますか? – tayl0rs

+1

@ tayl0rsバッファの最大配列サイズがそのポイントを超えてしまうので、それは問題ではない。非常に大規模な配列サポートを有効にしても、どの次元でもこれを超えることはできません。 「備考」を参照してください:https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx(オフセットはストリームではなく配列に関係します) –

1

http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspxによればoffsetパラメータがoffset inside the byte[] arrayれる:

アレイ 型:System.Byte []は この方法戻り、オフセット(オフセット+間 値で指定されたバイト配列を含有しますcount-1)は、現在のソースから読み取られた バイトで置き換えられました。

オフセット タイプ:System.Int32 読み込みバイトが配置される配列内のバイトオフセット。

カウント タイプ:System.Int32 読み取る最大バイト数。

Read()だけlongであることを起こる現在の位置決幅から読み込み、Read()を呼び出す前に設定する必要がありますがhttp://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx

関連する問題