1

我正在尝试通过 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();

    }

当我逐步检查文件名和文件大小时,它们是正确的。byte[] 也被完全填充。关于我接下来可以做什么的任何线索?

提前致谢...

肖恩

编辑!!!:

所以我弄清楚发生了什么。当我读取一个字符串,然后从流中读取 Int 时,字节数组的长度为 256 个索引。所以我对字符串的读取正在接受 int,然后它将破坏其他区域。需要弄清楚这个...

4

3 回答 3

3

一方面,您可以使用便捷的方法File.WriteAllBytes更简单地写入数据。但我怀疑这就是问题所在。

您假设您可以在一次调用 Read 中读取所有数据。您忽略了返回值。不要那样做 - 相反,阅读多次,直到你读完所有你期望的东西,或者你已经到达了流的末尾。有关详细信息,请参阅这篇文章。如果您使用的是 .NET 4,那么CopyTo您可能会发现一种新方法很有用。

(顺便说一句,您的使用ref表明您不了解它的真正含义。确保您了解C# 中的参数是如何传递的非常值得。)

于 2010-09-20T15:56:11.297 回答
3

要添加到 Jon Skeet 的答案,您的阅读代码应该是:

int bytesRead;
int readPos = 0;
do
{
    bytesRead = currentStream.Read(fileSent, readPos, fileSent.Length);
    readPos += bytesRead;
} while (bytesRead > 0);
于 2010-09-20T16:00:02.790 回答
0

如果您正在寻找通过网络发送和接收文件的通用解决方案,您是否考虑过使用C# 网络库?它可能已经解决了您在尝试执行此操作时会遇到的大部分问题。

免责声明:我是这个库的开发者之一。

于 2011-12-18T20:48:43.400 回答