Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#/FTP] Télécharger tout le contenu d'un dossier

Sujet résolu
Anonyme
22 juin 2015 à 9:26:30

Bonjour à tous et merci de prendre le temps de lire ce sujet.

Après de longues recherches, j'ai réussi à télécharger tout les fichiers d'un dossier mais dès lors qu'il y a un dossier dans un dossier, j'ai une erreur. Mon but est de reproduire à l’exactitude l’arborescence (à partir d'un dossier choisie) ainsi que les fichiers de mon serveur FTP sur mon disque dur. Si quelqu'un aurait une classe pour télécharger comme ça, ça serais parfait :lol:

Dans l'attente de vos réponse, je continue de chercher et partagerais toutes mes avancées.

  • Partager sur Facebook
  • Partager sur Twitter
22 juin 2015 à 15:24:42

Avec le code et le message d'erreur, ça serait plus simple.
  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
22 juin 2015 à 18:02:19

Bah le code est inexploitable vu qu'il ne peut pas télécharger un dossier mais que un fichier mais si tu veux je te passe ça demain car mon code est sur une machine au travail :/
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
23 juin 2015 à 9:18:50

            public static void DownloadFile(string dir1, string dir2, string user, string mdp)
            {
                //variable
                string Username = user; //ID
                string Password = mdp; // Mot de passe
                string repertoireLocal = dir1; // repertoir local
                string FichierListe = @"ftp://91.121.196.45/"+dir2; //fichier ou dossier à télécharger

                //end variable

                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(FichierListe);
                //renseigne les parametre de connexion
                request.Credentials = new NetworkCredential(Username, Password);
                //indique qu'on va lister les éléments du répertoire
                request.Method = WebRequestMethods.Ftp.ListDirectory;

                StreamReader streamReader = new StreamReader(request.GetResponse().GetResponseStream());

                string fileName = streamReader.ReadLine();
                //
                //Uri serverUri = new Uri("ftp://" + this.Server + "/" + repertoireFTP + "/" + nomFichier);
                Uri serverUri = new Uri(FichierListe);
                if (serverUri.Scheme != Uri.UriSchemeFtp)
                { return; }

                //créé un serveur URI
                FtpWebRequest myRequest = (FtpWebRequest)FtpWebRequest.Create(serverUri);
                //applique les parametres de connexion
                myRequest.Credentials = new NetworkCredential(Username, Password);
                //indique qu'on va downloader le fichier
                myRequest.Method = WebRequestMethods.Ftp.DownloadFile;

                FtpWebResponse response = (FtpWebResponse)myRequest.GetResponse();
                //créé un élément du flux
                Stream responseStream = response.GetResponseStream();
                //le flux se cale sur le répertoire défini en local et sur le fichier correspondant
                FileStream fs = new FileStream(repertoireLocal + fileName, FileMode.Create);

                //définit un buffer a 100kb
                byte[] buffer = new byte[100000];
                int read = 0;

                do
                {
                    //le flux lit les données du fichier
                    read = responseStream.Read(buffer, 0, buffer.Length);
                    //le flux écrit sur le FTP
                    fs.Write(buffer, 0, read);
                    //le flux est vidé
                    fs.Flush();
                } while (!(read == 0));

                //ferme les variable stream
                response.Close();
                responseStream.Close();
                fs.Close();
                //
                request = null;
                streamReader = null;
            }
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
23 juin 2015 à 11:58:24

Quand dans le dossier que je télécharge se trouve un autre dossier j'ai cette erreur

Une exception non gérée du type 'System.Net.WebException' s'est produite dans System.dll

Informations supplémentaires : Le serveur distant a retourné une erreur : (550) Fichier non disponible (par exemple, fichier introuvable, accès impossible).

-
Edité par Anonyme 23 juin 2015 à 11:59:12

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2015 à 14:55:00

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
23 juin 2015 à 15:45:15

Merci mais leurs programme est mois complet que le miens, impossible de visionner des fichiers et de descendre de 2 couches dans l'arborescence. Le téléchargement récupère uniquement l'élément sélectionné mais pas ce qu'il y a dedans si c'est un dossier... Mauvaise piste.

En revanche, je cherche à couplé ma fonction de téléchargement avec une autre fonction.

Cette autre fonction auras pour but de recréer l'arborescence du dossier sélectionner et par la suite répertorié tout les fichiers dans un tableau pour les télécharger les uns après les autres. Seulement je suis un peu perdu. Je ne sais pas comment créer une tel fonction.

Pour info j'ai une fonction "GetList" qui me permet de lister dans un tableau tout les dossiers et fichier contenu dans un dossier. Si j'appelle cette fonction avec un fichier en argument, celle ci peux me retourner si c'est un dossier ou un fichiers.

Quelqu'un aurais une idée de comment coordonné tout ça pour créer cette fonction?

Merci.

-
Edité par Anonyme 23 juin 2015 à 16:30:52

  • Partager sur Facebook
  • Partager sur Twitter
23 juin 2015 à 18:04:11

>mois complet que le miens

Vous voulez rire ???

L'exemple montre comment distinguer les fichiers des répertoires.

Vous n'avez qu'à implémenter un simple appel récursif pour avoir toute l'arborescence, mais attention aux cycles dans l'arborescence.

Il y a tout ce qu'il faut dans le projet dont est extrait l'exemple :

http://libftp.codeplex.com/

Évitez le syndrome NIH, SVP.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
24 juin 2015 à 10:53:42

J'ai trouvé l'erreur , le programme oubli de rajouter un "/" pour la navigation dans les dossiers, par exemple au lieux d'aller dans le dossier /torrents/test il va dans /torrentstest, cela viens du programme et j'ai réussi à le corriger.

Seulement lorsque que je télécharge le dossier test, il n'y a rien dedans

-
Edité par Anonyme 24 juin 2015 à 11:02:51

  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2015 à 12:22:29

Pouvez-vous montrez le bout de code qui n'a pas le comportement voulu ?
  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
24 juin 2015 à 15:51:29

private void downloadToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (lvwRemote.SelectedItems.Count == 0)
                return;
            if (lvwRemote.SelectedItems[0].ImageIndex==(int)directoryEntryTypes.file)
            {
                string filename=lvwRemote.SelectedItems[0].Text;
                testftp.addFileToDownloadQueue(txtHost.Text + lblRemotePath.Text + filename, lblLocalPath.Text + @"\" + filename);
                testftp.startProcessing();
            }
            else if (lvwRemote.SelectedItems[0].ImageIndex==(int)directoryEntryTypes.directory)
            {
                string filename = lvwRemote.SelectedItems[0].Text;
                testftp.addFolderToDownloadQueue(txtHost.Text + lblRemotePath.Text + filename, lblLocalPath.Text + @"\" + filename);
                testftp.startProcessing();
            }
        }
  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2015 à 16:23:25

Et en débuggant startProcessing, c'est quoi le problème ?
  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
24 juin 2015 à 19:14:04

Excusez moi, qu'est ce que vous entendez par débuguer startProcessing?
  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2015 à 19:36:34

Mettre un point d'arrêt au début de startProcessing et faire une exécution pas à pas du code de cette méthode pour voir où ça commence à déconner.
  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
24 juin 2015 à 20:29:28

Ok, je ferais ça demain, je vous remercie beaucoup de m'aider :D
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
25 juin 2015 à 9:16:25

Voici ce qu'il y a dans la fonction startProcessing

public void startProcessing()
		{
			_threadRunning=true;
			ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadForProcessQueue));
		}

Et voici ce qu'il y a dans la fonction addFileToDownloadQueue

public void addFileToDownloadQueue(string remotefilename, string localDestination)
		{
            queue.Add(remotefilename, new fileinfo(remotefilename, localDestination, directionEnum.down));
		}

Enfin voici la fonction addFolderToDownloadQueue

public void addFolderToDownloadQueue(string path, string localDestination)
		{
            if (Directory.Exists(localDestination) == false)
            {
                Directory.CreateDirectory(localDestination);
            }
            //path must be a valid directory. curse thru it.
            List<ftpinfo> contents = ftpobject.browse(path);
            if (contents == null)
                return;
            for (int i = 0; i < contents.Count; i++)
            {
                if (contents[i].fileType == directoryEntryTypes.file)
                {
                    addFileToDownloadQueue(contents[i].path + "/" + contents[i].filename, localDestination);
                }
                else
                {
                    addFolderToDownloadQueue(path + "/" + contents[i].filename,localDestination + @"\" + contents[i].filename);
                }
            }
		}





  • Partager sur Facebook
  • Partager sur Twitter
25 juin 2015 à 15:27:59

Mettez un point d'arrêt sur la méthode "ThreadForProcessQueue".

Pourquoi ne pas fournir le code de cette méthode ???

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
25 juin 2015 à 17:10:35

private void ThreadForProcessQueue(object stateInfo)
		{
			// No state object was passed to QueueUserWorkItem, so 
        	// stateInfo is null.

        	try
        	{
				while(_threadRunning && queue.Count>0)
				{
					//process next queue item
                    object[] keys = new object[queue.Keys.Count];
                    queue.Keys.CopyTo(keys, 0);
					fileinfo nextitem = (fileinfo)queue[keys[0]]; //process first item in the queue
                    if (nextitem.mkdirFlag)
                    {
                        ftpobject.createRemoteDirectory(nextitem);
                    }
                    else
                    {
                        if (nextitem.direction == directionEnum.down)
                        {
                            ftpobject.download(nextitem);
                        }
                        else
                        {
                            ftpobject.upload(nextitem);
                        }
                    }
					//remove item from queue after processing it
					queue.Remove(nextitem.completeFileName);
				}
        	}
        	catch(Exception ex)
            {
                ftpobject.OnStatusChange("Error occured: " + ex.Message, 0, 0);
        	}
        	finally{
				_threadRunning=false;
        	}
		}
  • Partager sur Facebook
  • Partager sur Twitter
25 juin 2015 à 20:41:13

Et il donne quoi le debugging de "ThreadForProcessQueue" ?

La boucle while boucle ?

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
26 juin 2015 à 9:28:42

Non, le programme saute la boucle, avec un espion j'ai constaté que queue.Count = 0 à chaque fois, et
_threadRunning est égale à true dans  startProcessing juste avant, donc le problème viens de queue. Je ne comprend pas, queue c'est quelle type de variable, je ne trouve pas où elle est déclaré?


J'ai remarquer autre chose aussi, depuis le début je télécharge le dossier torrents/test dans lequel se trouve d'autres dossiers et des fichiers text seulement une fois télécharger il est vide. J'ai télécharger le dossier torrents sans faire exprès et la la boucle while à bouclé, mais il n'y a que les dossiers présent dans torrents qui on été créer, aucun fichier n'a été télécharger...

-
Edité par Anonyme 26 juin 2015 à 9:39:59

  • Partager sur Facebook
  • Partager sur Twitter
26 juin 2015 à 14:31:35

>queue.Count = 0 à chaque fois

Donc normal que ça "marche" pas.

Dans une mécanique à queue de Task, vous ne devez enregistrer qu'une fois la procédure de dépilement.

Donc startProcessing() devrait être appelé qu'un fois, ce qui n'est pas le cas.


>queue c'est quelle type de variable

Il n'y a que vous qui peut y répondre. Utilisez le menu contextuel dans VS, il y a "Go to definition" dans ce menu.


Je pense qu'il y a une autre routine qui dépile les messages avant votre routine startProcessing.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
26 juin 2015 à 15:12:47

C'est bon, en m'inspirant de la fonction addFolderToDownloadQueue j'ai réussi à créer ma propre fonction, je donne tout les détails pour ceux qui serait intéressé, bon il faut avouer que c'est un peut du bidouillage surtout avec la variable qui contient "IsNoDoC9987566" mais je ne voyais pas d'autre solution :lol:

public static void DownloadDirectory(string Identifiant, string MDP, string DocLocal, string DocFtp)
            {
                string[] testDir = {"IsNoDoC9987566"};
                string[] testDir3 = Get1List(Identifiant, MDP, DocFtp);
                if (testDir3[0] != testDir[0])
                {
                    if (Directory.Exists(DocLocal + "/" + Path.GetFileName(DocFtp)) == false)
                    {
                        Directory.CreateDirectory(DocLocal + "/" + Path.GetFileName(DocFtp));
                    }
                    string[] content = Get1List(Identifiant, MDP, DocFtp);
                    foreach (string f in content)
                    {
                        string[] testDir2 = Get1List(Identifiant, MDP, DocFtp + "/" + f);
                        if (testDir2[0] != testDir[0] && f != "")
                        {
                            DownloadDirectory(Identifiant, MDP, DocLocal+"/"+ Path.GetFileName(DocFtp), DocFtp + "/" + f);
                        }
                        if (testDir2[0] == testDir[0] && f != "")
                        {
                            DownloadFile(Identifiant, MDP, DocFtp + "/" + f, DocLocal + "/" + Path.GetFileName(DocFtp));
                        }
                    }
                }
                else
                {
                    DownloadFile(Identifiant, MDP, DocFtp , DocLocal );
                }

            }
public static string[] Get1List(string Identifiant, string MDP, string doc)
            {
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://91.121.196.45/" + doc);
                    request.Method = WebRequestMethods.Ftp.ListDirectory;
                    request.Credentials = new NetworkCredential(Identifiant, MDP);
                    try
                    {
                        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
                        Stream responseStream = response.GetResponseStream();
                        StreamReader reader = new StreamReader(responseStream);
                        string liste = reader.ReadToEnd();
                        string liste2 = liste.Replace("\r", string.Empty);
                        string[] list2 = liste2.Split(new Char[] { '\n' });
                        for (int i = 0; i<list2.Length; i++)
                        {
                            if (list2[i] != string.Empty)
                            {
                                string[] fictive = new string[1];
                                fictive = list2[i].Split(new Char[] { '/' });
                                list2[i] = fictive[1];
                            }
                        }
                        reader.Close();
                        response.Close();
                        return list2;
                    }
                    catch
                    {
                        string[] nodoc = { "IsNoDoC9987566" };
                        return nodoc;
                    }
            }
public static void DownloadFile(string UserName, string Password, string ftpDirectory, string LocalDirectory)
            {
                string ftpURL = "ftp://91.121.196.45/";
                string FileName = Path.GetFileName(ftpDirectory);

                if (!File.Exists(LocalDirectory + "/" + FileName))
                {
                    try
                    {
                        FtpWebRequest requestFileDownload = (FtpWebRequest)WebRequest.Create(ftpURL + "/" + ftpDirectory);
                        requestFileDownload.Credentials = new NetworkCredential(UserName, Password);
                        requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile;
                        FtpWebResponse responseFileDownload = (FtpWebResponse)requestFileDownload.GetResponse();
                        Stream responseStream = responseFileDownload.GetResponseStream();
                        FileStream writeStream = new FileStream(LocalDirectory + "/" + FileName, FileMode.Create);
                        int Length = 2048;
                        Byte[] buffer = new Byte[Length];
                        int bytesRead = responseStream.Read(buffer, 0, Length);
                        while (bytesRead > 0)
                        {
                            writeStream.Write(buffer, 0, bytesRead);
                            bytesRead = responseStream.Read(buffer, 0, Length);
                        }
                        responseStream.Close();
                        writeStream.Close();
                        requestFileDownload = null;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }

Voilà, pour plus de précision vous pouvez me contacter par message privée, je serais heureux de vous aider. Merci à bacelar de m'avoir aider, maintenant je dois trouver la solution pour intégrer une progresse bar mais je vais essayer de chercher par moi même avant de créer un nouveau sujet :lol:


  • Partager sur Facebook
  • Partager sur Twitter
31 octobre 2019 à 15:32:29

Pouvez-vous fournir le projet dans un .zip svp.
  • Partager sur Facebook
  • Partager sur Twitter
31 octobre 2019 à 20:42:54

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter