Irakli Lekishvili
Irakli Lekishvili

Reputation: 34158

Error reading file into array

I get the following error on the second iteration of my loop:
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.

and this is my loop

    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

Upvotes: 6

Views: 13893

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1499770

On the first iteration, you're calling

fs.Read(_FileName, 0, 1024);

That's fine (although why you're calling Convert.ToInt32 on an int, I don't know.)

On the second iteration, you're going to call

fs.Read(_FileName, position, 2048);

which is trying to read into the _FileName byte array starting at position (which is non-zero) and fetching up to 2048 bytes. The byte array is only 1024 bytes long, so that can't possibly work.

Additional problems:

  • You haven't used a using statement, so on exceptions you'll leave the stream open
  • You're ignoring the return value from Read, which means you don't know how much of your buffer has actually been read
  • You're unconditionally sending the socket the complete buffer, regardless of how much has been read.

Your code should probably look more like this:

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);
    }
}

Upvotes: 12

Related Questions