目前我有这个代码,它通过网络接收信息,将其存储到内存中的字节数组中,然后通过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,然后将它们重写到硬盘驱动器。
我怎么能这样做?
答案 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。