URLDownloadToFile загрузка половины файла

1

Я использую URLDownload для загрузки файла, я загрузил 5 файлов (zip), 2 из них поврежден, и первый из них я попытался перезагрузить (2-3 раза), и он работает второй после 20 (раз) stiil dameged, кажется, что он прекратил загрузку до ее завершения.

Поврежденный (я загружаю этот файл вручную, а zip open fine и размер 75kb, а файл, загруженный с URLDownload, имеет серию 11kb, вы видите разницу и знаете, что она не полностью загружена\повреждена)

Мой код

[DllImport("urlmon.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 URLDownloadToFile(Int32 pCaller, string szURL, string szFileName, Int32 dwReserved, Int32 lpfnCB);

 int response = URLDownloadToFile(0, Link, FilePath, 0, 0);

       if (response == 0)
        {
      lsUtils.WriteToLog("File  " + FileName + " downloaded.", true);
      int zipTry = 10;
      if (!isValidZip(FilePath))
                 {
  clsUtils.WriteToLog("Attempting to re-download damaged file   " + FileName, true);
  while (!isValidZip(FilePath) && zipTry > 1)
        {
  clsUtils.WriteToLog("File  " + FileName + " Zip file damaged.", true);
  response = URLDownloadToFile(0, Link, FilePath, 0, 0);
                                            zipTry--;

                                        }
                                    }
Теги:

1 ответ

0

Зачем использовать URLDownloadToFile? Это чрезвычайно крутой способ загрузки файла в.NET.

Вместо этого здесь простой пример в.NET 4. 5+:

async Task DownloadAndSaveAsync(string url, string filePath)
{
    HttpClient client = new HttpClient();
    var response = await client.GetAsync(url);

    // Was the request successful?
    if (response == null || !response.IsSuccessStatusCode) return;

    using (var file = File.Create(filePath))
    {
        await response.Content.CopyToAsync(file);
    }
}

Если у вас нет.NET 4. 5+, вам нужно будет использовать HttpWebRequest, но он все же намного лучше, чем P/Invoke.

Что касается исходной проблемы с URLDownloadToFile, я бы предположил, что она не блокирует, поэтому она по-прежнему загружается в фоновом режиме в то время, когда вы проверяете, является ли zip действительным, а затем вы перезаписываете его второй попыткой и т.д. Поэтому это не что он не проходит через загрузку - вы не дожидаетесь достаточно долго. Но опять же, это просто догадка. Вы не должны создавать зависимости от Internet Explorer, если они вам действительно не нужны :)

  • 0
    Я использую 4.0, и я думаю, что HttpWebRequest не будет работать, потому что эти файлы находятся на сайте банка после логина / пароля, и вам нужно иметь куки + разрешение перед началом их загрузки, вы не можете просто вставить URL и загрузить эти файлы ,
  • 0
    @ user3567884 Ну, вы также можете использовать куки и учетные данные в HttpWebRequest . В любом случае, загрузка IE для вас, вероятно, не лучшее использование (в некотором смысле, это в значительной степени дыра в безопасности IE). Но если вы хотите придерживаться этого, просто используйте метод обратного вызова, чтобы узнать, когда файл действительно загружен. Он загружается асинхронно, поэтому, когда вы проверяете, скорее всего, он еще не закончил загрузку. Обратный вызов ( lpfnCB ) сообщит вам, когда это произойдет. Если я не ошибаюсь. Но вы можете попробовать это легко - запустите метод и просто немного подождите, прежде чем проверять файл.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню