C# System.ArgumentException使用FileStream

C# System.ArgumentException使用FileStream,c#,winforms,sockets,client-server,system.io.file,C#,Winforms,Sockets,Client Server,System.io.file,我首先创建一个FileStream来打开文件,读入缓冲区,然后调用NetworkStream.write()来写入其内容,而不是一次读取所有内容 这是密码 using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { try { int len = (int)fs.Length; byte[] data = new byte[len];

我首先创建一个
FileStream
来打开文件,读入缓冲区,然后调用
NetworkStream.write()
来写入其内容,而不是一次读取所有内容

这是密码

using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    try
    {
        int len = (int)fs.Length;
        byte[] data = new byte[len];
        byte[] buffer = new byte[bufferSize];
        int count, sum = 0;
        while ((count = fs.Read(buffer, sum, len - sum)) > 0)
        {
            netstream.Write(buffer,sum,len-sum);
            sum += count;  
        }
...
它抛出了一个错误:

中发生类型为“System.ArgumentException”的未处理异常 mscorlib.dll

其他信息:

偏移量和长度超出了数组的界限或计数更大 大于从索引到源结尾的元素数 收藏

我在这里没有看到任何数组越界问题


建议请

偏移量和长度应基于缓冲区长度而不是整个文件,以下是从
文件流
读取卡盘数据并将其写入另一个流的示例:

        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
                byte[] buffer = new byte[bufferSize];

                while (true)
                {
                    var count = fs.Read(buffer, 0, buffer.Length);
                    if (count == 0) break;
                    netstream.Write(buffer, 0, count);
                }
        }

偏移量和长度应基于缓冲区长度,而不是整个文件,以下是从
文件流
读取卡盘数据并将其写入另一个流的示例:

        using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
        {
                byte[] buffer = new byte[bufferSize];

                while (true)
                {
                    var count = fs.Read(buffer, 0, buffer.Length);
                    if (count == 0) break;
                    netstream.Write(buffer, 0, count);
                }
        }

看起来您正在将
len
字节读取到大小为
bufferSize
的缓冲区。由于
len==fs.Length
bufferSize
它会将exception.read从流中抛出到
数据中,或者以块形式读取。我假设,您想将数据块读入缓冲区,但您做得不对
lensum
强制流一次读取所有字节(因为
len=fs.Length
sum=0
)。应该明智地保持
buffer==len
吗?是的,我希望它在chunksNo中。我认为应该是fs.Read(buffer,0,bufferSize)
。同样的想法
netstream.Write
。第二个参数表示
缓冲区中的偏移量
,因此它应该是
0
,因为您要存储缓冲区中的数据。看起来您正在将
len
字节读取到大小为
bufferSize
的缓冲区。由于
len==fs.Length
bufferSize
它会将exception.read从流中抛出到
数据中,或者以块形式读取。我假设,您想将数据块读入缓冲区,但您做得不对
lensum
强制流一次读取所有字节(因为
len=fs.Length
sum=0
)。应该明智地保持
buffer==len
吗?是的,我希望它在chunksNo中。我认为应该是fs.Read(buffer,0,bufferSize)
。同样的想法
netstream.Write
。第二个参数表示
缓冲区中的偏移量
,因此它应该是
0
,因为您希望存储缓冲区中的数据。