读写大文件c#

时间:2012-01-18 01:14:45

标签: file send

即时编写文件传输应用程序来发送和接收大数据,如1 GB ..但我想当我从文件中读取数据并将其填充到一个字节数组中时,它存储在RAM中,这会对计算机产生影响速度......我应该这样做:

(loop till end of the file)
{
   read 128 MB from the file into byte array
   (loop till end of 128)
   {
       send 1 kb to server
   }
   byte array = null
}

如果那是对的.. 哪个更好!! beginSend和beginReceive发送大文件或只是循环发送文件

如果你用一些代码教我,我会很高兴的 提前谢谢:)

2 个答案:

答案 0 :(得分:0)

如果你[开始]发送超过大约的数据,Windows将开始表现得很奇怪。一次性1MB。这在Windows版本,网络驱动程序,用户的鞋号和月相之间有所不同。低于1 MB你应该没问题。

所以,

(loop till end of the file)
{
   read 128 MB from the file into byte array
   (loop till end of 128)
   {
       send 1 MB to server
   }
   byte array = null
}

或者,如果它确实是一个文件

SendFile(filename[,...])

答案 1 :(得分:0)

甚至128mb都不是一个好方法..它更好地读取一个小缓冲区..然后直接发送到另一边

检查出来。

将fileName和fileSize发送到另一侧

之后

这应该在(服务器/客户端)

中很常见
FileStream fs;
NetworkStream network;
int packetSize = 1024*8;

发送方法

public void Send(string srcPath, string destPath)
    {
        byte data;
        string dest = Path.Combine(destPath, Path.GetFileName(srcPath));
        using (fs = new FileStream(srcPath, FileMode.Open, FileAccess.Read))
        {
            try
            {
                long fileSize = fs.Length;
                long sum = 0;
                int count = 0;
                data = new byte[packetSize];
                while (sum < fileSize)
                {
                    count = fs.Read(data, 0, packetSize);
                    network.Write(data, 0, count);
                    sum += count;
                }
                network.Flush();
            }
            finally
            {
                fs.Dispose();
                data = null;
            }
        }
    }

接收方式:

    public void Receive(string destPath, long fileSize)
    {
        byte data;
        using (fs = new FileStream(destPath, FileMode.Create, FileAccess.Write))
        {
            try
            {
                int count = 0;
                long sum = 0;
                data = new byte[packetSize];
                while (sum < fileSize)
                {
                    count = network.Read(data, 0, packetSize);
                    fs.Write(data, 0, count);
                    sum += count;
                }
            }
            finally
            {
                fs.Dispose();
                data = null;
            }
        }
    }