C# [Resolu] - Téléchargement de masse dans un Agent

A

Anonymous

Invité
#1
Bonjour à tous,

Premièrement : Bonne année à tous et surtout la santé.

Deuxièmement : Voici mon problème, je dois faire un agent (petit programme type console exécuté périodiquement par le gestionnaire de tache planifiées) qui devra me télécharger des images à partir de site web de manière automatique.

Cet agent est relié à un base de donnée et il sait quel est son dernier téléchargement donc tous les heures il va devoir lancer sa routine pour vérifier que de nouvelles images ont été publiées et si oui alors les télécharger.

Mon problème vient du fait que le programme me télécharge ma première image puis bloque sur la seconde.

J'utilise ceux - ci :

Code:
class Tools
    {
        void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            Console.WriteLine("File downloaded");
        }
        
        public void DownloaFileFromUri(Uri url, string file)
        {
            WebClient client = new WebClient();

            client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);

            try
            {
                client.DownloadFileAsync(url, file);
            }
            catch (Exception e)
            {
                Console.WriteLine("LogError : " + e.Message);
            }
        }

        /// <summary>
        /// This method will check a url to see that it does not return server or protocol errors
        /// </summary>
        /// <param name="url">The path to check</param>
        /// <returns></returns>
        public bool UrlIsValid(string url)
        {
            WebRequest webRequest = WebRequest.Create(url);
            WebResponse webResponse;
            try
            {
                webResponse = webRequest.GetResponse();
            }
            catch //If exception thrown then couldn't get response from address
            {
                return false;
            }
            return true;
        }
    }
Les deux premières fonctions sont liées car elles permettent le téléchargement en asynchrone et la troisième fonction vérifie si les url sont OK.

Merci par avance à tous et bon courage.
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#2
Re: [Requete] - Téléchargement de masse dans un Agent

Bin faudrait peut être avoir les appels de ces fonctions pour t'aider. Voir un peu comment tu gère tout ça.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#3
Re: [Requete] - Téléchargement de masse dans un Agent

Salut , perso je fais sans async(m'en fou que ca bloque le thread puisqu'il sert juste a ca , et du coup pas besoin de verifier si le telechargement est fini puisque le thread reprend quand c'est fini :mrgreen: ) et ca marche plutôt bien :
Code:
Private Sub DownLoadFile(remote_file As String, local_file As String)
        Dim webClient As New WebClient()
        webClient.DownloadFile(remote_file, local_file)
        'TextBox1.AppendText(vbNewLine & "downloaded " & remote_file & " to " & local_file)
    End Sub
 
A

Anonymous

Invité
#4
Re: [Requete] - Téléchargement de masse dans un Agent

Voici le programme et ce qu'il se passe :

Code:
Console.WriteLine("Check");
                
                MangaScanEntities entity = new MangaScanEntities();
                Tools tools = new Tools();
                string mainPath = "C:";

                if(Directory.Exists(string.Format("{0}\\{1}", mainPath, "MangaScan")) == false)
                {
                    string temp = string.Empty;
                    Directory.CreateDirectory(temp = string.Format("{0}\\{1}", mainPath, "MangaScan"));
                    Console.WriteLine("Create - " + temp);
                }

                var listOfMangas = entity.Configuration.ToList();

                foreach (var manga in listOfMangas)
                {
                    Console.WriteLine("Current - " + manga.Title + " - " + manga.CurrentChapter);

                    string path = string.Empty;
                    string file = "00.jpg";
                    bool chapterAndPage = false;
                    string url = string.Empty;
                    string url2 = string.Empty;
                    string urlTemp = string.Empty;
                    int page = 0;

                    if (Directory.Exists(path = string.Format("{0}\\{1}\\{2}\\{3}", mainPath, "MangaScan", manga.Title.ToString(), manga.CurrentChapter.ToString())) == false)
                    {
                        Directory.CreateDirectory(path = string.Format("{0}\\{1}\\{2}\\{3}", mainPath, "MangaScan", manga.Title.ToString(), manga.CurrentChapter.ToString()));
                        Console.WriteLine("Create - " + path);
                    }

                    while ((chapterAndPage = tools.UrlIsValid(url = string.Format(manga.Url.ToString(), manga.Title.ToString(), manga.CurrentChapter.ToString(), file))) || tools.UrlIsValid(url2 = string.Format(manga.Url.ToString(), manga.Title.ToString(), manga.CurrentChapter.ToString(), file = string.Format("{0} - {1}", manga.CurrentChapter.ToString(), file))))
                    {
                        if(chapterAndPage == true) urlTemp = url;
                        else urlTemp = url2;

                        Console.WriteLine("Download - " + urlTemp);

                        tools.DownloaFileFromUri(new Uri(urlTemp), string.Format("{0}\\{1}", path, file));

                        Thread.Sleep(5000);

                        string pageNumber = string.Empty;

                        if (chapterAndPage == true) pageNumber = file.Split('.')[0].ToString();
                        else
                        {
                            pageNumber = (file.Split('.')[0].ToString());
                            pageNumber = pageNumber.Substring(pageNumber.Length - 2);
                        }

                        Console.WriteLine("Current Page Number : " + pageNumber);

                        if (int.TryParse(pageNumber, out page))
                        {
                            page += 1;

                            if (page < 10)
                            {
                                file = string.Format("0{0}.jpg", page);
                            }
                            else
                            {
                                file = string.Format("{0}.jpg", page);
                            }

                            Console.WriteLine("Next File : " + file);
                        }
                    }

                    if (page > 1)
                    {
                        manga.CurrentChapter++;
                        Console.WriteLine("Current - " + manga.Title + " - " + manga.CurrentChapter);
                    }
                        
                    entity.SaveChanges();
                }

                Console.WriteLine("Check Finish");
                Console.ReadLine();
Voici le resultat :



Désolé le code est un peu bourrin mais je souhaite faire du fonctionnel avant de faire de l'optimisé.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#5
Re: [Requete] - Téléchargement de masse dans un Agent

rhooo ... async pour pas bloquer le thread puis juste apres ... :
tools.DownloaFileFromUri(new Uri(urlTemp), string.Format("{0}\\{1}", path, file));
Thread.Sleep(5000);//on bloque le thread 5 secondes :mrgreen:

apperement le serveur accepte pas plusieur fois la meme ip car si le fichier est pas fini de telechargé (le 01 est pas fini) et que tu entames un autre telechargement ca bloque , vire l'async et ca va marcher
 
A

Anonymous

Invité
#6
Re: [Requete] - Téléchargement de masse dans un Agent

Helas mon programme ne fonctionne pas non plus avec DownloadFile, c'est se que j'avais essayer au tout début et sa fonctionne pas sa me met un timeout du site.


Voici le resultat :

 
A

Anonymous

Invité
#7
Re: [Requete] - Téléchargement de masse dans un Agent

l'Url a télécharger n'était pas avec la bonne extension : différence entre .jpg et .JPG

Voila voila merci pour votre aide.
 
Haut Bas