Файл загружен не полностью

Я разрабатываю приложение, которое загружает видео с заданного URL. Проблема в том, что я не получаю все содержимое файла и не могу воспроизвести файл. Например, при попытке загрузить видео размером ~ 2,23 МБ я получаю только ~ 2,11 МБ. Когда я использую URL-адрес в браузере, он показывает мне диалоговое окно для сохранения видео, и файл загружается успешно.

Я пробовал использовать класс WebClient , и он работает, но я хочу загружать файл по частям, чтобы иметь возможность сообщать о статусе (процент выполнения). Вот код, который я использую:

  private void backgroundWorker_DoWork (отправитель объекта, DoWorkEventArgs e) {int bufferSize = 1024 * 300;  строка filePath = saveFileDialog.FileName;  если (File.Exists (filePath)) File.Delete (filePath);  int totalBytes = 0;  HttpWebRequest webRequest = (HttpWebRequest) HttpWebRequest.Create (DownloadUrl);  длинный contentLength = webRequest.GetResponse (). ContentLength;  using (Stream webStream = webRequest.GetResponse (). GetResponseStream ()) using (StreamReader reader = new StreamReader (webStream)) с использованием (BinaryWriter fileWriter = new BinaryWriter (File.Create (filePath))) {do {char [] buffer =  новый символ [размер буфера];  bytesRead = reader.ReadBlock (буфер, 0, размер буфера); //также пробовал с Read (buffer, 0, bufferSize);  totalBytes + = bytesRead;  Console.WriteLine ("Прочитано байтов:" + bytesRead + "Всего байтов:" + totalBytes + "Длина содержимого:" + contentLength);  если (bytesRead> 0) fileWriter.Write (buffer, 0, bytesRead);  } пока (! reader.EndOfStream);  }}  

Я также пытался читать до bytesRead = 0 , но результат тот же. Что-то мне не хватает?


Я бы порекомендовал вам вместо этого использовать DownloadFileAsync. Это предоставляет вам два события, которые значительно упрощают отслеживание хода загрузки.

DownloadProgressChangedEventHandler

DownloadFileCompleted

Очень простая реализация будет выглядеть примерно так.

  WebClient client = new WebClient (); client.DownloadProgressChanged + = new DownloadProgressChangedEventHandler (DownloadProgressCallback); client.DownloadFileAsync (DownloadUrl, filePath);   

Затем создайте функцию, обновляющую индикатор выполнения.

  private void DownloadProgressCallback (отправитель объекта, DownloadProgressChangedEventArgs e) {myProgressBar.  Value = e.ProgressPercentage;}  

У вас также есть доступ к таким данным, как e.BytesReceived и e.TotalBytesToReceive код>.


Изменить:

Главное изменение, которое мне пришлось сделать, — это изменить ваш буфер с char [] на byte [] , а затем использовать Stream вместо StreamReader.

Мы также проверяем конец файла, проверка, есть ли какие-нибудь байты для записи на наш жесткий диск. Если больше нечего писать, мы знаем, что мы закончили.

  private static void download () {int bufferSize = 1024 * 300;  string filePath = "Test.exe";  если (File.Exists (filePath)) File.Delete (filePath);  int totalBytes = 0;  HttpWebRequest webRequest = (HttpWebRequest) HttpWebRequest.Create (@ "http://www.rarlab.com/rar/wrar420.exe");  длинный contentLength = webRequest.GetResponse (). ContentLength;  Console.WriteLine (totalBytes);  используя (WebResponse webResponse = webRequest.GetResponse ()) используя (Stream reader = webResponse.GetResponseStream ()) используя (BinaryWriter fileWriter = new BinaryWriter (File.Create (filePath))) {int bytesRead = 0;  байт [] буфер = новый байт [размер буфера];  сделать {bytesRead = reader.Read (буфер, 0, buffer.Length);  totalBytes + = bytesRead;  fileWriter.Write (буфер, 0, bytesRead);  Console.WriteLine ("BytesRead:" + bytesRead + "- TotalBytes:" + totalBytes);  } while (bytesRead> 0);  }}  

0

Попробуйте

  private void backgroundWorker_DoWork (отправитель объекта, DoWorkEventArgs e) {int bufferSize = 1024 * 300;  строка filePath = saveFileDialog.FileName;  если (File.Exists (filePath)) File.Delete (filePath);  int totalBytes = 0;  HttpWebRequest webRequest = (HttpWebRequest) HttpWebRequest.Create (DownloadUrl);  длинный contentLength = webRequest.GetResponse (). ContentLength;  using (Stream webStream = webRequest.GetResponse (). GetResponseStream ()) using (StreamReader reader = new StreamReader (webStream)) с использованием (BinaryWriter fileWriter = new BinaryWriter (File.Create (filePath))) {do {char [] buffer =  новый символ [размер буфера];  bytesRead = reader.ReadBlock (буфер, 0, размер буфера); //также пробовал с Read (buffer, 0, bufferSize);  totalBytes + = bytesRead;  Console.WriteLine ("Прочитано байтов:" + bytesRead + "Всего байтов:" + totalBytes + "Длина содержимого:" + contentLength);  если (bytesRead> 0) fileWriter.Write (buffer, 0, bytesRead);  } пока (! reader.EndOfStream);  fileWriter.flush ();  }}  

Привет, это была моя проблема, я только что добавил fileWriter.flush (); вне цикла

Поделиться
Улучшить этот ответ
отредактировано 17 апреля ’13 в 18:21
ответил 17 апр. ’13 в 18:16
  • 2
    Я бы порекомендовал вам оставить комментарий к тому, что именно вы изменили и почему. — eandersson 17 апр. ’13 в 18:18
добавить комментарий |

Попробуйте

  private void backgroundWorker_DoWork (отправитель объекта, DoWorkEventArgs e) {int bufferSize  = 1024 * 300;  строка filePath = saveFileDialog.FileName;  если (File.Exists (filePath)) File.Delete (filePath);  int totalBytes = 0;  HttpWebRequest webRequest = (HttpWebRequest) HttpWebRequest.Create (DownloadUrl);  длинный contentLength = webRequest.GetResponse (). ContentLength;  using (Stream webStream = webRequest.GetResponse (). GetResponseStream ()) using (StreamReader reader = new StreamReader (webStream)) с использованием (BinaryWriter fileWriter = new BinaryWriter (File.Create (filePath))) {do {char [] buffer =  новый символ [размер буфера];  bytesRead = reader.ReadBlock (буфер, 0, размер буфера); //также пробовал с Read (buffer, 0, bufferSize);  totalBytes + = bytesRead;  Console.WriteLine ("Прочитано байтов:" + bytesRead + "Всего байтов:" + totalBytes + "Длина содержимого:" + contentLength);  если (bytesRead> 0) fileWriter.Write (buffer, 0, bytesRead);  } пока (! reader.EndOfStream);  fileWriter.flush ();  }}  

Привет, это была моя проблема, я только что добавил fileWriter.flush (); вне цикла

Оцените статью
Botgadget.ru
Добавить комментарий