C# WebClient загружает пустой файл

Я работаю над приложением, которое использует API Bing для поиска и загрузки изображений. API Bing предоставляет набор ссылок на изображения, и я перебираю их и загружаю каждую.

Проблема, с которой я сталкиваюсь, заключается в том, что иногда размер загружаемого файла составляет 0 КБ. Я предполагаю, что это происходит потому, что WebClient сначала создает имя файла, а затем пытается в него записать. Поэтому, когда он не может писать на него по какой-то причине, это происходит. Проблема в том, что это происходит без исключения, поэтому мой оператор «Catch» не может поймать это и удалить файл.

public void imageFetcher(string performerName, int maxNumberOfImages, RichTextBox richTextBox)
    {
        string performersDirPath = Environment.CurrentDirectory + @"\Performers\";
        string performerPath = performersDirPath + performerName + @"\";

        if (!Directory.Exists(performersDirPath))
        {
            Directory.CreateDirectory(performersDirPath);
        }

        if (!Directory.Exists(performerPath))
        {
            Directory.CreateDirectory(performerPath);
        }

        // Searching for Images using bing api
        IEnumerable<Bing.ImageResult> bingSearch = bingImageSearch(performerName);

        int i = 0;

            foreach (var result in bingSearch)
            {
                downloadImage(result.MediaUrl, performerPath + performerName + i + ".jpg",richTextBox);
                i++;
                if (i == maxNumberOfImages)
                {
                    break;
                }
            }
    }

Способ загрузки:

public void downloadImage(string imgUrl, string saveDestination, RichTextBox richTextBox)
    {
        if (File.Exists(saveDestination))
        {
            richTextBox.ForeColor = System.Drawing.Color.Red;
            richTextBox.AppendText("The File: " + saveDestination + "Already exists");

        }
        else
        {
            try
            {
                using (WebClient client = new WebClient())
                    {

                    client.DownloadFileCompleted += new AsyncCompletedEventHandler(((sender, e) => downloadFinished(sender, e, saveDestination , richTextBox)));
                    Uri imgURI = new Uri(imgUrl, UriKind.Absolute);

                    client.DownloadFileAsync(imgURI, saveDestination);
                    }
            }
            catch (Exception e)
            {
                richTextBox.AppendText("There was an exception downloading the file" + imgUrl);
                richTextBox.AppendText("Deleteing" + saveDestination);
                File.Delete(saveDestination);
                richTextBox.AppendText("File deleted!");

            }

        }

    }

Это происходит также, когда я пытаюсь дождаться завершения работы клиента:

client.DownloadFileAsync(imgURI, saveDestination);

                        while (client.IsBusy)
                        {

                        }

Может ли кто-нибудь сказать мне, что я делаю неправильно?

В другом симуляционном вопросе решение заключалось в том, чтобы оставить экземпляр Webclient открытым до завершения загрузки. Я делаю это с помощью этого цикла:

while (client.IsBusy){}

Тем не менее, результаты одинаковы.

Обновление: я решил не использовать веб-клиент, вместо этого я использовал этот код:

try
                        {
                            byte[] lnBuffer;
                            byte[] lnFile;

                            using (BinaryReader lxBR = new BinaryReader(stream))
                            {
                                using (MemoryStream lxMS = new MemoryStream())
                                {
                                    lnBuffer = lxBR.ReadBytes(1024);
                                    while (lnBuffer.Length > 0)
                                    {
                                        lxMS.Write(lnBuffer, 0, lnBuffer.Length);
                                        lnBuffer = lxBR.ReadBytes(1024);
                                    }
                                    lnFile = new byte[(int)lxMS.Length];
                                    lxMS.Position = 0;
                                    lxMS.Read(lnFile, 0, lnFile.Length);
                                }

using (System.IO.FileStream lxFS = new FileStream(saveDestination, FileMode.Create))
                                    {

                                        lxFS.Write(lnFile, 0, lnFile.Length);
                                    }

Это решает проблему почти полностью, есть еще один или два файла размером 0 КБ, но я предполагаю, что это из-за сетевых ошибок.


person Curtwagner1984    schedule 15.11.2015    source источник
comment
Возможный дубликат Загруженный файл с помощью webclient. DownloadFileAsync имеет размер 0 КБ   -  person Fᴀʀʜᴀɴ Aɴᴀᴍ    schedule 15.11.2015
comment
дубликат stackoverflow.com/questions/26534980/ и stackoverflow.com/questions/8373368/   -  person Fᴀʀʜᴀɴ Aɴᴀᴍ    schedule 15.11.2015
comment
Решение в stackoverflow.com/ Questions/8373368/ должен ждать до тех пор, пока (client.IsBusy имеет значение false). Я сделал это, и все же те же результаты.   -  person Curtwagner1984    schedule 15.11.2015
comment
@ Куртвагнер1984 Привет. Вы решили эту проблему - я столкнулся с той же проблемой.   -  person Saturn Technologies    schedule 19.01.2016
comment
@SaturnTechnologies Да, смотрите обновленный пост выше.   -  person Curtwagner1984    schedule 21.01.2016
comment
@ Куртвагнер1984 Отлично! Спасибо   -  person Saturn Technologies    schedule 24.01.2016


Ответы (1)


Чтобы увидеть возможные исключения, попробуйте изменить DownloadFileAsync на DownloadFile — моя проблема была «Не удается создать безопасный канал SSL/TLS». Надеюсь, это поможет кому-то.

person Ján Maniš    schedule 17.07.2018
comment
Префект, просто идеал! - person Christopher Smit; 27.06.2019