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 :

GetFiles et searchpattern


Sujet :

C#

  1. #1
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut GetFiles et searchpattern
    Bonjour,
    J'ai un p'tit blème pour lister les fichiers d'un répertoire. Je voudrais les lister selon plusieurs searchpattern (pour avoir p.ex. tous les fichiers d'extension x et tous les fichiers d'extension y) ou alors lister selon une chaine de caractère que je ne veux pas voire apparaître dans les noms de fichiers.
    Directory.GetFiles ne permet qu'un seul searchpattern.
    On peut bricoler en lançant plusieurs fois GetFiles et en ajoutant les différents résultats au même tableau mais...

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    utilise un List<string> comme collection globales

    et tu fait ca pou chaqe getfiles

    List<String> list = new List<String>();
    list.AddRange(Directory.GetFiles(searchpattern));
    ...
    list.AddRange(Directory.GetFiles(searchpattern));
    return list.ToArray();

    ca te retourne une String[] des nom de fichiers non ?
    faut faire gafe je sais pu s GetFiles retourne des String ou autre chose...

    peut etre faudra t'il bidouiller.

  3. #3
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Ouais, sympa, j'y avais pensé...
    Le problème c'est que getFile te retourne un string[] et que AddRange de List<string> n'accepte pas de string[]
    Pour finir, j'ai bidouillé... Si ça intéresse qqun :
    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
    45
    46
     
    /// <summary>
        /// Retourne une liste de fichiers d'un répertoire 
        /// d'après un ou plusieurs searchpattern et une valeur
        /// indiquant s'il faut rechercher dans les sous-répertoires
        /// </summary>
        /// <param name="path">Répertoire dans lequel rechercher</param>    
        /// <param name="searchPattern">Chaine représentant la ou les chaines à rechercher dans les noms de fichiers
        /// Pour utiliser plusieurs chaines à rechercher, les séparer par une virgule (',')</param>
        /// <param name="excludeExtension">Chaine représentant la ou les extensions de fichier à exclure de la recherche.
        /// Pour utiliser plusieurs extensions à exclure, les séparer par une virgule (',')</param>
        /// <param name="searchOption">Indique s'il faut inclure les sous-répertoires dans la recherche</param>
        /// <returns>Tableau string des chemins de fichiers trouvés</returns>
        public static List<string> GetFiles(string path, string searchPattern, string excludeExtension, SearchOption searchOption)
        {
          List<string> PathList;
          string[] PathArray;
          string[] Patterns;
          string[] Extensions;
     
          PathList = new List<string>();
          try
          {
            Patterns = searchPattern.Split(',');
            TrimStringArray(ref Patterns); 
            Extensions = excludeExtension.Split(',');
            TrimStringArray(ref Extensions);
     
            foreach (string Pattern in Patterns)
            {
              PathArray = Directory.GetFiles(path, Pattern, searchOption);
              foreach (string s in PathArray)
              {
                if (!ArrayContains(Extensions, Path.GetExtension(s)))
                {
                  PathList.Add(s);
                }
              }
            }
          }
          catch (Exception ex)
          {
            throw ex;
          }
          return PathList;
        }
    TrimStringArray, ça c'est un truc à moi. Faut pas chercher dans l'aide... Ah oui, le ArrayContains aussi... (pas dif à coder...)

    Cte bidouille me convient bien... En tous cas pour ce que je veux faire. Il est clair que si je voulais exclure de la recherche des parties de string contenues dans les noms de fichiers j'en aurais eu pour un peu plus cher (à contrôler les * et ? etc...)

    Enfin, voilà voilà...
    (Je reviendrai voir demain pour mettre un résolu...)
    Bonne soirée

  4. #4
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Plus court:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        public Dictionary<string, long> scannerRep(string chemRep) {
            Dictionary<string, long> ret = new Dictionary<string, long>();
            string[] chr = new string[] { "*.xml", "*.pdf" };
            for (int i = 0; i < chr.Length; i++) {
                string[] fics = Directory.GetFiles(chemRep, chr[i], SearchOption.AllDirectories);
                foreach (string fic in fics) {
                    FileInfo fi = new FileInfo(fic);
                    ret.Add(fic.Replace(chemRep, ""), fi.Length);
                }
            }
            return ret;
        }
    Bien entendu, il est conseillé de passer le tableau de chaines en paramètres... Pour mon besoin, ce n'était pas utile.

    On peut également se contenter de retourner un tableau de chaine... Pour mon besoin, ce n'était pas suffisant.

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Le problème c'est que getFile te retourne un string[] et que AddRange de List<string> n'accepte pas de string[]
    Soit dit en passant, un string[] accepte la méthode ToList() de Linq qui permet de passer d'un array à une liste Plus de soucis pour ajouter un array à une liste via AddRange() maintenant
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. For Each File : SearchPattern multiple
    Par Kiboumz dans le forum VB.NET
    Réponses: 1
    Dernier message: 28/06/2007, 08h04
  2. [VB.NET] Getfiles 2 arguments
    Par diaboloche dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/03/2007, 13h57
  3. Réponses: 2
    Dernier message: 01/12/2006, 19h55
  4. [VB.NET] getfiles et regexp
    Par gerald2545 dans le forum VB.NET
    Réponses: 2
    Dernier message: 06/09/2006, 13h40
  5. getFile et FileExists
    Par maxos75 dans le forum ASP
    Réponses: 2
    Dernier message: 24/03/2006, 15h12

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