首先我想说的是,我试图研究如何理解我要问的问题,但却无法想出我想要的东西。这就是说,我想我会问你们一些疯狂的聪明人,以最好的方式为我解释这一点。
我的问题是我有一个非常好的“复制粘贴”代码,可以使用ftpWebRequest下载文件。我将粘贴下面的代码:
public static void DownloadFiles()
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://****/test.zip");
request.Credentials = new NetworkCredential("****", "*****");
request.UseBinary = true;
request.Method = WebRequestMethods.Ftp.DownloadFile;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream writer = new FileStream("***/test.zip", FileMode.Create);
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[2048];
readCount = responseStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
writer.Write(buffer, 0, readCount);
readCount = responseStream.Read(buffer, 0, bufferSize);
}
responseStream.Close();
response.Close();
writer.Close();
}
就像我说的那样完美无缺,下载zip文件没有任何问题。我想要了解的是因为我认为“复制粘贴”代码是一个可怕的想法,这实际上是如何功能。我不理解的唯一部分是这些点之间实际发生的事情:
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[2048];
readCount = responseStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
writer.Write(buffer, 0, readCount);
readCount = responseStream.Read(buffer, 0, bufferSize);
}
如果有人愿意解释缓冲区中实际发生的事情,为什么我们将其设置为2048以及while循环实际执行的操作将非常感激。作为一个方面,我没有通过代码,并将消息框和其他调试放入试图了解最新情况但没有成功。提前谢谢你,如果这看起来非常基本,我道歉。
答案 0 :(得分:1)
以2 kB块的形式从流中读取数据并写入文件:
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[2048]; // a buffer is created
// bytes are read from stream into buffer. readCount contains
// number of bytes actually read. it can be less then 2048 for the last chunk.
// e.g if there are 3000 bytes of data, first Read will read 2048 bytes
// and second will read 952 bytes
readCount = responseStream.Read(buffer, 0, bufferSize);
while (readCount > 0) // as long as we have read some data
{
writer.Write(buffer, 0, readCount); // write that many bytes from buffer to file
readCount = responseStream.Read(buffer, 0, bufferSize); // then read next chunk
}
答案 1 :(得分:0)
代码将responseStream
的内容读入buffer
数组,并将其写入writer
。 while
循环是必需的,因为当您在流上调用Read()
时,无法保证它将读取足够的字节来填充缓冲区。流只保证,如果有任何要读取的内容(换句话说,您还没有到达流的末尾),它将至少读取一个字节。无论它做什么,它将返回读取的实际字节数。因此,您必须继续调用Read()
,直到它返回0,这意味着您已到达流的末尾。缓冲区的大小是任意的。您可以使用长度为1的缓冲区,但使用大约2-4kb的内容可能会带来性能优势(由于网络数据包或磁盘扇区的典型大小)。