我正在尝试通过NetworkStream发送文件并在客户端重建它。我可以正确地获取数据(我认为)但是当我使用BinaryWriter或FileStream对象来重新创建文件时,无论我使用何种方法,文件都会在同一点开始切断。
private void ReadandSaveFileFromServer(ref TcpClient clientATF,ref NetworkStream currentStream, string locationToSave)
{
int fileSize = 0;
string fileName = "";
fileName = ReadStringFromServer(ref clientATF,ref currentStream);
fileSize = ReadIntFromServer(ref clientATF,ref currentStream);
byte[] fileSent = new byte[fileSize];
if (currentStream.CanRead && clientATF.Connected)
{
currentStream.Read(fileSent, 0, fileSent.Length);
WriteToConsole("Log Recieved");
}
else
{
WriteToConsole("Log Transfer Failed");
}
FileStream fileToCreate = new FileStream(locationToSave + "\\" + fileName, FileMode.Create);
fileToCreate.Seek(0, SeekOrigin.Begin);
fileToCreate.Write(fileSent, 0, fileSent.Length);
fileToCreate.Close();
//binWriter = new BinaryWriter(File.Open(locationToSave + "\\" + fileName, FileMode.Create));
//binWriter.Write(fileSent);
//binWriter.Close();
}
当我单步执行并检查fileName和fileSize时,它们是正确的。 byte []也已完全填充。关于我接下来可以做什么的任何线索?
提前致谢...
肖恩
编辑!!!:
所以我弄清楚发生了什么。当我从流中读取字符串然后读取Int时,字节数组长度为256个索引。所以我对字符串的读取正在接受int,然后会破坏其他区域。需要弄清楚......
答案 0 :(得分:3)
首先,您可以使用便捷方法File.WriteAllBytes
更简单地编写数据。但我怀疑那是问题所在。
您假设您可以在一次调用Read中读取所有数据。你忽略了返回值。不要这样做 - 而是多次阅读,直到你已经阅读了你期望的一切,或者你已经到达了流的末尾。见this article for more details。如果您使用的是.NET 4,那么您可能会发现一种新的CopyTo
方法。
(另外,您使用ref
表示您不明白它的真正含义。确保您理解how arguments are passed in C#非常值得。)
答案 1 :(得分:3)
要添加Jon Skeet的答案,您的阅读代码应为:
int bytesRead;
int readPos = 0;
do
{
bytesRead = currentStream.Read(fileSent, readPos, fileSent.Length);
readPos += bytesRead;
} while (bytesRead > 0);
答案 2 :(得分:0)
如果您正在寻找通过网络发送和接收文件的一般解决方案,您是否考虑使用C# network library?它可能已经解决了您在尝试这样做时遇到的大多数问题。
免责声明:我是该图书馆的开发者之一。