我正在尝试使用C#类NetworkStream传输数据库,但每次都会转换不同数量的字节.即使数据库很小(388KB),也只有一部分传递给客户端.传递一个小文本文件没有问题.
服务器:
NetworkStream netStream = client.GetStream();
byte[] file = File.ReadAllBytes(Directory.GetCurrentDirectory() + "\\viruses_database.accdb");
netStream.Write(file, 0, file.Length);
Run Code Online (Sandbox Code Playgroud)
客户:
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();
Run Code Online (Sandbox Code Playgroud)
我怀疑问题在于转移不是异步完成的
stream.Write(bytes, 0, bytes.Length);
Run Code Online (Sandbox Code Playgroud)
那是一个错误.您只收到长度字节,但您正在写入1024字节.这将随意破坏文件中的数据并使其最终大小不可预测.固定:
stream.Write(bytes, 0, length);
Run Code Online (Sandbox Code Playgroud)
支持CopyTo()方法(自.NET 4以来可用)以避免这样的错误:
using (var input = client.GetStream())
using (var output = new FileStream(path, FileMode.Create, FileAccess.Write)) {
input.CopyTo(output);
}
Run Code Online (Sandbox Code Playgroud)
Directory.GetCurrentDirectory()是另一个错误,它太不可预测了,当你的程序安装在用户的机器上时,你很少能写入它.数据文件属于appdata目录,使用Environment.GetFolderPath()
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |