接收到通过NetworkStream发送的文件时已损坏C#

接收到通过NetworkStream发送的文件时已损坏C#,c#,filestream,file-transfer,networkstream,C#,Filestream,File Transfer,Networkstream,我的目标是使用NetworkStream通过TCP连接发送文件。 我首先发送要发送的数据长度,然后使用文件流和二进制写入程序逐字节发送数据 在调试该进程时,我发现接收端的文件末尾有一些“0”字节。 例如,基本文件的内容azertyuiop作为azerty(4个空格替换uiop)接收,导致图像等文件损坏 到目前为止,我得到的代码是: (其中br是二进制读取器,bw是二进制编写器) 发件人: using (var readStream = new FileStream(fileLocation, F

我的目标是使用NetworkStream通过TCP连接发送文件。 我首先发送要发送的数据长度,然后使用文件流和二进制写入程序逐字节发送数据

在调试该进程时,我发现接收端的文件末尾有一些“0”字节。 例如,基本文件的内容
azertyuiop
作为
azerty
(4个空格替换
uiop
)接收,导致图像等文件损坏

到目前为止,我得到的代码是: (其中br是二进制读取器,bw是二进制编写器)

发件人:

using (var readStream = new FileStream(fileLocation, FileMode.Open))
{
    // Send the data length first
    bw.Write(new FileInfo(fileLocation).Length);
    bw.Flush();

    var buffer = new byte[1];
    while (readStream.Read(buffer, 0, 1) > 0)
    {
          bw.Write(buffer[0]);
          bw.Flush();
    }
}
接收人:

// Get data length
var dataLength = br.ReadInt32();

using (var fs = new FileStream(newFileLocation, FileMode.Create))
{
    var buffer = new byte[1];
    for(int i = 0; i < dataLength; i++)
    {
        br.Read(buffer, 0, 1);
        fs.Write(buffer, 0, 1);
    }
}
//获取数据长度
var dataLength=br.ReadInt32();
使用(var fs=newfilestream(newFileLocation,FileMode.Create))
{
var buffer=新字节[1];
对于(int i=0;i

我遗漏了什么或做错了什么?

fileinfo.length是一个很长的长度,而不是int32

问题可能是以下几点:

bw.Write(new FileInfo(fileLocation).Length);
...
var dataLength = br.ReadInt32();

Length
属性实际上是
long
(8字节)类型。但是您读取的值为
Int32
(4字节),其余4字节留在流中。

看看这个答案,看看他们是如何发送和接收数据长度的。这不是问题的一部分,但您一次读取和写入一个字节的效率非常低。使用较大的缓冲区和读取调用的结果来查看需要写入多少。尤其是刷新每个字节,不要这样做谢谢,我还有一个问题:有没有比使用大小为1的字节数组更好的方法?可能更大?是的,您应该将缓冲区大小增加到几千字节,并相应地调整循环。读取流时,请注意Read()方法的返回值,因为它实际上返回读取的字节数。这将帮助您确定何时到达流的末尾,即使您的缓冲区大于最后读取的部分。这样,您甚至可以避免完全使用数据长度值,而只需检查流的结尾。