Я работаю над приложением, которое использует 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 КБ, но я предполагаю, что это из-за сетевых ошибок.