在c#中发送消耗大量内存的大文件

本文关键字:内存 文件 | 更新日期: 2023-09-27 18:19:43

我正在通过TCP/IP网络发送非常大的文件,该文件正在按预期工作。

只有一个问题是如何有效地发送它,以便优化内存消耗。

以下是工作代码

Stream fileStream = File.OpenRead(tbFilename.Text);
byte[] fileBuffer = new byte[fileStream.Length];
fileStream.Read(fileBuffer, 0, (int)fileStream.Length);

// Open a TCP/IP Connection and send the data
   TcpClient clientSocket = new TcpClient(tbServer.Text,8080);
   NetworkStream networkStream = clientSocket.GetStream();
   networkStream.Write(fileBuffer,0,fileBuffer.GetLength(0));
   networkStream.Close();

在c#中发送消耗大量内存的大文件

首先,Stream.Read可能不会只读取一个区块来读取整个文件,但您忽略了返回值,即读取的字节数。

其次,您应该使用较小的缓冲区(例如4K)并使用它来发送文件。

const int BUFSIZE = 4096;
long transferred = 0L;
long length = fileStream.Length;
using (BinaryReader br = new BinaryReader(fileStream))
{
    while (transferred < length)
    {
        int chunkSize = Math.Min(length - transferred, BUFSIZE);
        byte[] buffer = br.ReadBytes(chunkSize);
        networkStream.Write(buffer, 0, chunkSize);
        transferred += chunkSize;
        // here you can even report some progress to adjust a ProgressBar or something
    }
}

您可以使用Stream.CopyTo()将数据从源流复制到另一个源流。

CopyTo()方法使用taffer建议的临时缓冲区。

之后不要忘记刷新()网络流。

    using (Stream fileStream = File.OpenRead(tbFilename.Text))
    {
        TcpClient clientSocket = new TcpClient(tbServer.Text, 8080);
        NetworkStream networkStream = clientSocket.GetStream();
        fileStream.CopyTo(networkStream);
        networkStream.Flush();
        networkStream.Close();
        clientSocket.Close();
    }