Метод read возвращает количество возвращаемых байтов, которое может быть меньше количества запрошенных байтов.Обычно, когда вы читаете файл, вы получаете все запрошенные байты (если вы не достигли конца файла), однако, вы не можете рассчитывать на это всегда так.
Вполне возможно, что система будет различать данные, которые немедленно доступны, и данные, которые требуют времени для извлечения, так что она вернет данные, доступные в данный момент, сразу, начнет читать больше данных в фоновом режиме и ожидает, что вызапросить остальные данные в другом вызове.AFAIK, он не делает этого в настоящее время, но это разумный сценарий будущего.
Вы должны получить результат метода Read
и использовать его, чтобы определить, сколько данных вы получили.Вы не должны читать его в буфер по адресу offset
, тогда вы не можете прочитать файл, который больше буфера.В качестве альтернативы, вы можете объявить массив для хранения всего потока, а затем прочитать данные в расположение offset
.
. Вам также следует обработать ситуацию, когда метод Read
возвращает ноль, что означаетчто больше нет данных для чтения.Обычно этого не происходит до тех пор, пока вы не достигнете конца файла, но если это произойдет, он переместит ваш код в вечный цикл.
byte[] data = new byte[30];
int numBytesToRead = (int)fStream.Length;
int offset = 0;
//reading
while (numBytesToRead > 0) {
int len = fStream.Read(data, 0, data.Length);
offset += len;
numBytesToRead -= len;
if (len == 0 && numBytesToRead > 0) {
// error: unexpected end of file
}
//do something with the data (len bytes)
}