Ошибка чтения файла в массив - PullRequest
6 голосов
/ 04 октября 2011

На второй итерации цикла я получаю следующую ошибку:
Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.

и это мой цикл

    FileStream fs = new FileStream("D:\\06.Total Eclipse Of The Moon.mp3", FileMode.Open);

    byte[] _FileName = new byte[1024];
    long _FileLengh = fs.Length;

    int position = 0;

    for (int i = 1024; i < fs.Length; i += 1024)
    {
        fs.Read(_FileName, position, Convert.ToInt32(i));

        sck.Client.Send(_FileName);
        Thread.Sleep(30);

        long unsend = _FileLengh - position;

        if (unsend < 1024)
        {
            position += (int)unsend;
        }
        else
        {
            position += i;
        }
    }
    fs.Close();
}

fs.Length = 5505214

1 Ответ

12 голосов
/ 04 октября 2011

На первой итерации вы звоните

fs.Read(_FileName, 0, 1024);

Это хорошо (хотя почему вы звоните Convert.ToInt32 на int, я не знаю.)

На второй итерации вы будете вызывать

fs.Read(_FileName, position, 2048);

, который пытается прочитать в байтовый массив _FileName, начиная с position (который не равен нулю) иизвлечение до 2048 байт .Массив байтов имеет длину всего 1024 байта, поэтому он не может возможно работать.

Дополнительные проблемы:

  • Вы не использовали usingоператор, поэтому при исключениях вы оставляете поток открытым
  • Вы игнорируете возвращаемое значение из Read, что означает, что вы не знаете, сколько вашего буфера имеет на самом деле прочитано
  • Вы безоговорочно отправляете сокету полный буфер, независимо от того, сколько было прочитано.

Ваш код должен выглядеть примерно так:

using (FileStream fs = File.OpenRead("D:\\06.Total Eclipse Of The Moon.mp3"))
{
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
    {
        sck.Client.Send(buffer, 0, bytesRead);
        // Do you really need this?
        Thread.Sleep(30);
    }
}
...