如何写入文件而不是内存字节数组?

时间:2015-10-08 03:09:55

标签: c# .net sockets file-transfer

目前我有这个代码,它通过网络接收信息,将其存储到内存中的字节数组中,然后通过FileStream将其写出来。

 StreamReader reader = new StreamReader(tcpClient.GetStream());

  // first message is file size
         string cmdFileSize = reader.ReadLine();

  // first message is filename
        string cmdFileName = reader.ReadLine();

        int length = Convert.ToInt32(cmdFileSize);
        byte[] buffer = new byte[length];
        int received = 0;
        int read = 0;
        int size = 1024;
        int remaining = 0;


   while (received < length)
        {
            remaining = length - received;
            if (remaining < size)
            {
                size = remaining;
            }

            read = tcpClient.GetStream().Read(buffer, received, size);
            received += read;
            if (read < size)
            {
                break;
            }
        }    

在此之后,&#34;缓冲区&#34;通过FileStream写入文件。这很好用,但是当我有大文件时,很明显会占用大量内存。我想将这些文件直接传输到磁盘,而不是写入ram,然后将它们重写到硬盘驱动器。

我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您是否只是使用StreamWriter将内容流式传输到文件中?

StreamReader reader = new StreamReader(tcpClient.GetStream());

// first message is file size
string cmdFileSize = reader.ReadLine();

// first message is filename
string cmdFileName = reader.ReadLine();

int length = Convert.ToInt32(cmdFileSize);
byte[] buffer = new byte[length];
int received = 0;
int read = 0;
int size = 1024;
int remaining = 0;

using (FileStream writer = File.OpenWrite("outfile.dat"))
{
    while (received < length)
    {
        remaining = length - received;
        if (remaining < size)
        {
            size = remaining;
        }

        read = tcpClient.GetStream().Read(buffer, 0, size);
        received += read;
        writer.Write(buffer, 0, size);

        if (read < size)
        {
            break;
        }
    }
}

另外,我认为您的代码中存在错误。我假设您使用的System.Net.Sockets.TcpClient在调用NetworkStream时会返回GetStream()个对象。在这种情况下,Read方法的第二个参数应该总是为0.该参数指示buffer变量中的哪个位置开始写入从网络读取的数据。如果你不使用0,你可能会遇到数组越界异常。查看Stream.Read方法的docs