Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error reading file into array

Tags:

c#

filestream

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
like image 480
Irakli Lekishvili Avatar asked Oct 04 '11 18:10

Irakli Lekishvili


1 Answers

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);
    }
}
like image 68
Jon Skeet Avatar answered Oct 24 '22 18:10

Jon Skeet