2011-08-18 5 views
5

FileStream.Read() được định nghĩa là:FileStream, đọc đoạn dữ liệu từ tệp lớn. Tập tin lớn hơn int. Làm thế nào để thiết lập bù đắp?

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

Làm thế nào tôi có thể đọc một số byte từ một bù đắp lớn hơn int.MaxValue?

Hãy nói rằng tôi có một tập tin rất lớn và tôi muốn đọc 100MB bắt đầu từ vị trí 3147483648.

Làm thế nào tôi có thể làm điều đó?

Trả lời

11

offset ở đây là độ lệch trong mảng để bắt đầu viết. Trong trường hợp của bạn, chỉ cần đặt:

stream.Position = 3147483648; 

và sau đó sử dụng Read(). Các offset thường được sử dụng khi bạn biết bạn cần phải đọc [n] byte:

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

này sẽ đọc chính xác 20 byte vào buffer (hoặc ném một ngoại lệ). Lưu ý rằng Read() không được đảm bảo để đọc tất cả dữ liệu bắt buộc trong một lần, do đó cần phải tăng vòng lặp bù đắp.

+0

thấy Nhưng điều gì sẽ xảy ra khi bù đắp đi trên int.MaxValue? Làm thế nào bạn sẽ xử lý điều đó? – tayl0rs

+1

@ tayl0rs kể từ khi kích thước mảng tối đa cho bộ đệm sẽ được vượt quá tại thời điểm đó, nó là một mối quan tâm tranh luận. Ngay cả khi hỗ trợ mảng rất lớn được bật, bạn không thể vượt quá kích thước đó trong bất kỳ thứ nguyên nào; xem "nhận xét" ở đây: https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx (và lưu ý: bù đắp liên quan đến mảng, chứ không phải luồng) –

1

Theo http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx tham số offset là một offset inside the byte[] array:

mảng Loại: System.Byte [] Khi phương pháp này trở về, chứa các mảng byte chỉ định với các giá trị giữa bù đắp và (bù đắp + đếm - 1) được thay thế bằng số byte được đọc từ nguồn hiện tại.

offset Loại: System.Int32 Giá trị bù byte trong mảng mà tại đó byte đọc sẽ được đặt.

đếm Loại: System.Int32 Số byte tối đa để đọc.

Read() chỉ đọc từ vị trí phía hiện tại mà sẽ xảy ra là một long và cần được thiết lập trước khi gọi Read()http://msdn.microsoft.com/en-us/library/system.io.filestream.position.aspx