使用NetworkStream传输文件然后重建文件失败

时间:2010-09-20 15:51:14

标签: c# .net tcpclient networkstream

我正在尝试通过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,然后会破坏其他区域。需要弄清楚......

3 个答案:

答案 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?它可能已经解决了您在尝试这样做时遇到的大多数问题。

免责声明:我是该图书馆的开发者之一。