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
,因为您希望存储缓冲区中的数据。