Classe de communication en FTP

MGD Software 75 Messages postés vendredi 1 septembre 2006Date d'inscription 17 janvier 2018 Dernière intervention - 17 janv. 2018 à 18:39 - Dernière réponse : Whismeril 11060 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 février 2018 Dernière intervention
- 3 févr. 2018 à 19:02
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

http://codes-sources.commentcamarche.net/source/102463-classe-de-communication-en-ftp

Afficher la suite 
Whismeril 11060 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 19 février 2018 Dernière intervention - 3 févr. 2018 à 19:02
Bonjour
je n'ai pas testé ta source, en effet on suppose toujours que le "déposeur" poste un code fonctionnel, et je n'ai rien à télécharger en ftp.
Et comme je n'y connais rien dans ce domaine, je ne suis pas capable de te juger s'il existe d'autres solutions à te conseiller.

Par contre, sur des petits bouts de ce code, voici quelques remarques.

Tout ce qui est dans la région Évènements est commenté, pourquoi?

Tu utilises une structure pour DirEntry. C'est un type valeur, ce qui implique qu'à chaque fois que tu le passes d'une méthode à une autre, ça copie tout dans un nouvel espace mémoire. Ça finit par être beaucoup plus gourmand en mémoire qu'une classe.
De plus, avec un constructeur c'est la classe qui s'initialise elle même à l'inverse de la structure.
Ici par exemple
                DirEntry Entry = new DirEntry();
                Entry.rights = values[0].Trim();
                Entry.number = values[1].Trim();
                Entry.user = values[2].Trim();
                Entry.group = values[3].Trim();
                Entry.isdir = Entry.rights[0] == 'd';

Pourrait être remplacé par
                DirEntry Entry = new DirEntry(values);

Dans l'idée, l'objet Entry sait à quoi correspondent les champs du tableau, car ça n'est pas le "problème" de la classe FTP.

J'ai l'impression que tu te compliques la vie avec le dictionnaire.
Un champ supplémentaire dans ta structure, et une List<T> aurait le même effet.
Avant toute création / mise à jour, on fait une recherche avec SingleOrDefaut, si le résultat est null alors on ajoute, sinon on met à jour.
Après, pour trier par exemple, il suffit d'un OrderBy()

A un moment, dans un foreach, tu initialises un tableau de mois.
Ce qui veut dire qu'à chaque boucle tu alloues un espace mémoire.
Ça remplit à chaque boucle, un peu de ram pour rien, jusqu'au passage du garbage collector.
Vu que ce tableau sert à chaque boucle de chaque appel de la méthode, le déclarer dans les variables privées de la classe serait plus judicieux.
D'ailleurs là pour le coup, ce tableau ne servant qu'à retourner l'index correspondant au mois, un dictionnaire serait tout aussi adapté.
            Dictionary<string, int> mois = new Dictionary<string, int>();
            mois.Add("Jan", 1);
            mois.Add("Feb", 2);
            mois.Add("Mar", 3);
            mois.Add("Apr", 4);
            mois.Add("May", 5);
            mois.Add("Jun", 5);
            mois.Add("Jul", 7);
            mois.Add("Aug", 8);
            mois.Add("Sep", 9);
            mois.Add("Oct", 10);
            mois.Add("Nov", 11);
            mois.Add("Dec", 12);

            int numeroMoi = mois["Jan"];
Par contre, c'est plus verbeux ;).

Je ne suis pas sûr d'avoir compris la façon dont tu construis Entry.date.
Peux tu poster les différents cas que tu rencontres?

Ici
            // On commence par vérifier que le répertoire supérieur existe
            int nPos = DirPath.LastIndexOf('/');
            string sParentPath;
            if (nPos > 0)
                sParentPath = DirPath.Substring(0, nPos);
            else
                sParentPath = "/";

Path.GetDirectoryName(DirPath) fait la même chose.

Une boucle while(true) présente toujours un risque de tourner à l'infini.
Tu peux remplacer par un timer, et un timer ça peut s'arrêter de l'extérieur.

C'est à peu près toutes les pistes "d'amélioration" que j'ai à te proposer.
Commenter la réponse de MGD Software

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.