簡體   English   中英

試圖了解字節[]數組C#中的數據傳輸

[英]Trying to understand Data transfer in byte[] Array C#

首先,我想說的是,我試圖研究如何理解我要問的問題,但卻無法提出我想要的東西。 話雖這么說,但我想我會請你們一些瘋狂的聰明人盡可能以最好的方式為我解釋這一點。

我的問題是我有一個很好的“復制粘貼”代碼,可以使用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循環實際上在做什么,將不勝感激。 順便說一句,我沒有遍歷代碼,並在消息框和其他調試窗口中嘗試了解發生了什么但沒有成功。 在此先感謝您,如果這看起來很簡單,我深表歉意。

從流中以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               
}

該代碼將responseStream的內容讀入buffer數組並將其寫出到writer while循環是必需的,因為當您在流上調用Read()時,無法保證它將讀取足夠的字節來填充緩沖區。 流僅保證,如果有任何要讀取的內容(換句話說,您還沒有到達流的末尾),它將至少讀取一個字節。 無論執行什么操作,它都會返回讀取的實際字節數。 因此,您必須繼續調用Read()直到它返回0,這意味着您已經到達流的末尾。 緩沖區的大小是任意的。 您可以使用長度為1的緩沖區,但是使用大約2-4kb的內容可能會帶來性能上的好處(由於網絡數據包或磁盤扇區的典型大小)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM