static void Download(string folder, string fileName, IGrabberCallbackObject callbacks)
 {
     callbacks.ReportDownloadStarted(fileName);
     Stream stream = null;
     const int bytesToRead = 4096 * 4;
     byte[] buffer = new byte[bytesToRead];
     try {
         HttpWebRequest fileRequest = (HttpWebRequest)HttpWebRequest.Create(GetNgramUrl(fileName));
         HttpWebResponse fileResponse = (HttpWebResponse)fileRequest.GetResponse();
         if(fileRequest.ContentLength > 0)
             fileResponse.ContentLength = fileRequest.ContentLength;
         callbacks.ReportFileSize(fileName, fileResponse.ContentLength);
         stream = fileResponse.GetResponseStream();
         long currentTotal = 0;
         using(FileStream fileStream = File.Create(folder + fileName)) {
             int length;
             do {
                 length = stream.Read(buffer, 0, bytesToRead);
                 fileStream.Write(buffer, 0, length);
                 currentTotal += length;
                 callbacks.ReportDownloadProgress(fileName, currentTotal);
             } while(length > 0);
         }
     } finally {
         if(stream != null)
             stream.Close();
     }
     callbacks.ReportDownloadFinished(fileName);
 }
 public static void DownloadTo(string folder, IGrabberCallbackObject callbacks)
 {
     if(!Directory.Exists(folder))
         Directory.CreateDirectory(folder);
     Download(folder, GetNgramFullFileName(TotalCountsType), callbacks);
     for(int i = 1; i < Ngrams.Length; i++) {
         foreach(string name in Ngrams[i]) {
             Download(folder, GetNgramFullFileName(i.ToString(), name), callbacks);
         }
     }
 }