IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Lister tous les répertoires d'un serveur


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut Lister tous les répertoires d'un serveur
    Bonjour à tous,

    J'aimerais créer une petite form pour mettre à jour mon application pls simplement qu'avec les options proposées par VS (clickatonce).

    J'aimerais stocker sur mon serveur dans un dossier les fichiers à télécharger (qui peuvent etre indépendants de l'exe, par exemple des images supplémentaires ou autre).

    Mais j'ai du mal à lister tous les fichiers/sous dossier d'un dossier de mon serveur et ce après de nombreuses recherches.

    J'aimerais que mon application regarde par exemple dans le dossier upload de mon serveur et télécharge tous les fichiers qui s'y trouvent sur l'ordinateur de l'utilisateur (si et seulement si ils sont plus récents que ceux que l'utilisateur possède).
    En soit, ça doit pas etre compliqué mais après deux bonnes heures de recherches je n'ai pas trouvé grand chose.



    Dans tous les cas après mes recherches j'en suis arrivé là pour compter le nombre de fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    string[] files = GetFileList();
    public string[] GetFileList()
            {
                string[] downloadFiles;
                StringBuilder result = new StringBuilder();
                WebResponse response = null;
                StreamReader reader = null;
                try
                {
                    FtpWebRequest reqFTP;
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));
                    reqFTP.UseBinary = true;
                    reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                    reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                    reqFTP.Proxy = null;
                    reqFTP.KeepAlive = false;
                    reqFTP.UsePassive = false;
                    response = reqFTP.GetResponse();
                    reader = new StreamReader(response.GetResponseStream());
                    string line = reader.ReadLine();
                    while (line != null)
                    {
     
                        result.Append(line);
                        result.Append("\n");
                        line = reader.ReadLine();
                    }
     
                    result.Remove(result.ToString().LastIndexOf('\n'), 1);
                    return result.ToString().Split('\n');
                }
                catch (Exception ex)
                {
                    DialogResult M = MessageBox.Show("Erreur MAJ" + ex.Message);
     
                }
            }
    Mais ce code considère un dossier comme un fichier, il va l'ajouter dans la liste et donc il ne parcourira pas les sous dossiers, comment reconnaitre un dossier (et donc parcourir tous les sous dossiers) avec ce code?

    J'ai essayé avec ListDirectoryDetails, il y a une balise <DIR> Dans le résultat mais c'est assez complexe à extraire je trouve :
    Pour un dossier on a un truc du genre
    "11-06-11 12:20AM <DIR> vf""
    pour un fichier : "11-06-11 12:13AM 20 index.html"

    De plus pour le moment je compte le nombre de fichier et j'ai une condition qui télécharge si c'est plus grand que 0. Il faudrait donc que ma fonction vérifie que la version de chaque fichier disponible sur le serveur est différente de celle locale avant d'incrémenter, pour éviter de faire une mise à jour plusieurs fois.
    Il faudrait pouvoir récupérer les infos sur chaque fichier (version et taille)

    Pour la taille il y a la méthode GetFileSize, mais je ne vois pas comment l'utiliser dans ce cas, un exemple serait le bienvenue.
    Comment faire ?


    Enfin, petit point de détail, j'ai mis tout ça dans une fonction (code pour compter le nombre, puis pour télécharger si il répond favorablement au MessageBox, j'ai appelé cette fonction dans mon form_load mais la form (avec les progress bar) ne se charge qu'après la fonction?

    Merci d'avance, r0seBa

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Sans etre expert dans le domaine, je pense que tu en demande un peu trop au protocole FTP.

    Je ne pense pas que tu puisse lui demander d'identifier la version des fichiers; car je devine que la version est stockée dans un format propre à windows, hors, le protocole FTP, il ne connait pas microsoft

    pour ton problème de repertoire confondu avec les fichiers, j'imagine que tu peux executer manuellement des commandes ftp pour obtenir l'info (rep ou fichier).

    Mais quoi qu'il en soit ; je pense que tu vois les choses sous un mauvais angle. le FTP comme son nom l'indique, c'est juste pour du transfert de fichier, en aucun cas du versionning. Tu dois je pense implémenter autre chose à coté, un service qui lit dans une BDD par exemple, tu lui donne ta version actuelle, il compare en base, puis te retourne l'emplacement FTP du fichier à aller rechercher.

    Cette approche me parraitrait plus sage...

  3. #3
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 172
    Points : 49
    Points
    49
    Par défaut
    Merci pour la réponse, finalement je stocke le tout dans une bdd J'ai encore quelques petits soucis :

    Comment comparer la version de deux fichiers ? Par exemple l'attribut version d'une image est vide, alors comment je peux voir que l'image est à télécharger ? En utilisant la denrière modif plutot ?


    Ensuite, j'essaye de créer un logiciel pour uploader le fichier mais je n'arrive pas à gérer la progressbar:

    J'utilise ce code pour uploader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    FileInfo fileInf = new FileInfo(filename);
                string uri = uri = "ftp://" + ftpServerIP + dossier + fileInf.Name;
                FtpWebRequest reqFTP;
                // Create FtpWebRequest object from the Uri provided
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + dossier + filename));
                // Provide the WebPermission Credintials
                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                // By default KeepAlive is true, where the control connection is not closed
                // after a command is executed.
                reqFTP.KeepAlive = false;
                // Specify the command to be executed.
                reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
                // Specify the data transfer type.
                reqFTP.UseBinary = true;
                // Notify the server about the size of the uploaded file
                reqFTP.ContentLength = fileInf.Length;
                // The buffer size is set to 2kb
                int buffLength = 2048;
                byte[] buff = new byte[buffLength];
                int contentLen;
                // Opens a file stream (System.IO.FileStream) to read the file to be uploaded
                FileStream fs = fileInf.OpenRead();
                try
                {
                    // Stream to which the file to be upload is written
                    Stream strm = reqFTP.GetRequestStream();
     
                    // Read from the file stream 2kb at a time
                    contentLen = fs.Read(buff, 0, buffLength);
                    this.progressBar2.Maximum = System.Convert.ToInt32(fs.Length) + 1;
                    this.progressBar2.Value = 0;
                    // Till Stream content ends
                    while (contentLen != 0)
                    {
                        // Write Content from the file stream to the FTP Upload Stream
                        strm.Write(buff, 0, contentLen);
                        contentLen = fs.Read(buff, 0, buffLength);
                        this.progressBar2.Value++;
                        Application.DoEvents();
                    }
                    // Close the file stream and the Request Stream
                    strm.Close();
                    fs.Close();
                }
    Et je n'arrive pas à gérer l'avancement de l'upload (avec ma progressbar2), comment faire?

    Merci

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    comme tu le dis , certains type de fichiers ne contiennent pas d'info de version. Quand à la date du fichier, personnellement, je m'en méfie comme de la peste.

    Je dirai plutot que c'est a celui qui place les fichiers sur le ftp, de mettre à jours la bdd. Apres je ne sais pas comment tu fonctionne...

    sinon, peut etre qu'un repository genre svn pourrait etre ce que tu recherche en fin de compte...

    Pour ton histoire de progressbar, c'est parceque tu fais tout dans le meme thread, du coup il est trop occupé pour raffraichir ta fenetre.

    Ajoute un BackgroundWorker à ta form, et tu t'abonne aux evenement Run, et Notifyprogression.

Discussions similaires

  1. [MySQL] Lister tous les répertoires récursivement
    Par TakingCTRL dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/08/2013, 08h21
  2. [PHP 5.2] Lister tous les répertoires de l'espace web
    Par renaud26 dans le forum Langage
    Réponses: 6
    Dernier message: 01/08/2011, 11h19
  3. Lister tous les répertoires virtuelles
    Par toxine7777 dans le forum ASP
    Réponses: 1
    Dernier message: 13/10/2010, 14h14
  4. [Tableaux] Lister tous les répertoires dans une liste
    Par cdevl32 dans le forum Langage
    Réponses: 10
    Dernier message: 01/03/2008, 18h20
  5. Lister tous les documents d'un répertoire
    Par Jiyuu dans le forum VB.NET
    Réponses: 7
    Dernier message: 22/09/2007, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo