无法使用C#NetworkStream传输大文件

本文关键字:传输 文件 C#NetworkStream | 更新日期: 2023-09-27 17:59:05

我正试图使用C#类NetworkStream传输数据库,但每次都会转换不同数量的字节。即使数据库很小(388KB),也只有一部分传递给客户端。传递一个小的文本文件时不会出现问题。

服务器:

 NetworkStream netStream = client.GetStream();
 byte[] file = File.ReadAllBytes(Directory.GetCurrentDirectory() +   "''viruses_database.accdb");
 netStream.Write(file, 0, file.Length);

客户端:

NetworkStream netStream=client.GetStream();
Stream stream = new FileStream(Directory.GetCurrentDirectory() + "''viruses_database.accdb", FileMode.Create, FileAccess.ReadWrite);
Byte[] bytes = new Byte[1024];
 int length=bytes.Length;
 int cnt = 0;
 while (netStream.CanRead && length==bytes.Length)
 {
     length = netStream.Read(bytes, 0, bytes.Length);
     stream.Write(bytes, 0, bytes.Length);
     cnt++;
 }
 stream.Close();

我怀疑问题在于传输不是异步完成的

无法使用C#NetworkStream传输大文件

  stream.Write(bytes, 0, bytes.Length);

这是个bug。您只收到长度字节,但您正在写入1024字节。这将任意破坏文件中的数据,并使其最终大小不可预测。修复:

  stream.Write(bytes, 0, length);

请支持CopyTo()方法(自.NET4以来可用),以避免出现以下错误:

  using (var input = client.GetStream())
  using (var output = new FileStream(path, FileMode.Create, FileAccess.Write)) {
      input.CopyTo(output);
  }

Directory.GetCurrentDirectory()是另一个错误,它太不可预测了,当你的程序安装在用户的机器上时,你很少能写入它。数据文件属于appdata目录,请使用Environment.GetFolderPath()