I am having an issue in downloading multiple image from server with ui updation. Problem is this that I have folders of wallpaper on server and I want to download images, I run a background worker to download images and to update my UI and my UI updation will be done once my all images gets downloaded(BackgroundWorker_Completed). But I want my UI to be updated every time when one folder of images gets downloaded as shown in below given image.
In above given example every folder contains multiple images such as Movies, Games, India etc and they have images of their belonging category e.g. in movies their are folders say Man Of Steel, Priest etc. Now when I am downloading my images they should be visible on UI every they gets downloads not in once at last. Code for downloading wallpaper given below:
Background Worker Code For Downloading Images
void worker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
DataSet dsFile = Global.ReadConfig;
XDocument xDoc = XDocument.Load(dsFile.Tables[0].Rows[0][8].ToString());
string s = xDoc.Root.Name.ToString();
var countNode = xDoc.Root.Elements().Count();
for (int i = 0; i < countNode; i++)
{
XNode childNode = xDoc.Root.Nodes().ElementAt(i);
XElement ele = (XElement)childNode;
string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\Wallpaper" + ele.Name;
var movieList = from a in xDoc.Root.Descendants(ele.Name).Elements()
select a;
foreach (var a in movieList)
{
string newpath = path + "" + a.Value;
DirectoryInfo di = new DirectoryInfo(newpath);
if (!di.Exists)
{
DirectoryInfo dinew = Directory.CreateDirectory(newpath);
filedownload(dsFile.Tables[0].Rows[0][1].ToString() + "/Wallpaper/" + ele.Name + "/" + dinew.Name + "/", newpath + "");
}
}
//new DesktopThemes.App_Page.MainWindow().getWallLink(ele.Name.LocalName);
}
}
catch
{
}
}
Background Worker Completed to display image on UI
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
string N = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"Wallpaper" ;
Random random = new Random();
List<String> backimage = new List<String>();
DirectoryInfo diback = new DirectoryInfo(N);
// diback.GetFiles();
Directory.GetFiles(N, "*.*", SearchOption.AllDirectories);
foreach (var imagename in diback.GetFiles("*.jpg", SearchOption.AllDirectories))
{
backimage.Add(imagename.Directory + "" + imagename.Name);
}
try
{
Image image = new Image();
Uri add = new Uri(backimage[random.Next(0, backimage.Count - 1)]);
image.Source = new BitmapImage(add);
pnlBackground.Source = image.Source;
this.Photos.Path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"Wallpaper";
}
catch (Exception ex)
{
}
}
Code For downloading images Which is being called from background worker
public static void filedownload(String url, string downloadlocation)
{
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(url);
ftpRequest.Credentials = new NetworkCredential(@username, @password);
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential(@username, @password);
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = url + directories[i].ToString();
string trnsfrpth = downloadlocation + directories[i].ToString(); if (!new System.IO.FileInfo(trnsfrpth).Exists)
{
ftpClient.DownloadFile(path, trnsfrpth);
}
}
}
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…