在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();
首先,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();
}