我的目标是使用NetworkStream通过TCP连接发送文件。 我首先发送我要发送的数据的长度,然后我使用文件流和二进制写入器逐字节发送数据。
在调试过程中,我发现在接收端文件的开始处放置了一些“0”字节。
例如,基本文件的内容azertyuiop
收到azerty
(4个空格替换uiop
),导致图像等文件损坏。
到目前为止我得到的代码: (其中br是BinaryReader,bw是BinaryWriter)
发信人:
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);
}
}
我错过了什么或做错了什么?
答案 0 :(得分:2)
问题可能如下:
bw.Write(new FileInfo(fileLocation).Length);
...
var dataLength = br.ReadInt32();
Length
属性实际上是long
类型(8个字节)。但是您正在将值读取为Int32
(4个字节),而在流中保留其他4个字节。
答案 1 :(得分:1)
fileinfo.length是一个long而不是int32