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 :

Trier des fichiers comme dans l'explorateur


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut Trier des fichiers comme dans l'explorateur
    Bonjour,

    Je cherche à trier une liste de fichiers dans un répertoire.
    J'ai donc utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Directory.GetFiles(workingDir, "*.fit*")
    Mais le résultat est surprenant :



    car différent de celui de l'explorateur Windows :



    Comprendre : le trie selon l'explorateur est celui alphabetico-numérique normal (0,1,2,3..) alors que GetFiles() me renvoie un ordre différent (1,10,100,101,..)

    D'après la MSDN, "Directory.GetFiles" tri par nom de fichier, mais ce tri n'est pas fiable. En effet..
    J'ai essayé un ArraySort(...) mais le tri est le même que GetFiles().


    Comment obtenir le même tri que dans l'explorateur ?

    Merci.

  2. #2
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 106
    Points
    3 106
    Par défaut
    Bonjour,

    la question est intéressante, je n'avais jamais observé ce problème.
    D'après ce que j'ai pu lire sur le sujet sur le net, il va te falloir implémenter ton propre Comparer pour effectuer un tri naturel.

    Regarde de ce côté

  3. #3
    Membre éprouvé

    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
    Points : 945
    Points
    945
    Par défaut
    Bonjour,

    Comme l'a précisé calagan99, le tri effectué par GetFiles est celui ontenu dans la classe string. Il met 1 avant 2, donc tous les 10, 11, 12, 100, 101, 110, 1000 etc seront avant 2.

    Pour pouvoir changer cela, il faut que tu crées une classe implémentant l'interface EqualityComparer<string> et que tu l'implémentes de manière à trier dans l'ordre que tu souhaites. Il suffira de passer cet objet à ta méthode de tri et le tour est joué !

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut
    En effet je viens de voir la différence entre un tri ASCII et un tri Naturel !

    Je suis tombé sur ca http://stackoverflow.com/questions/2...ort-order-in-c qu'en pensez-vous ?

    et que tu l'implémentes de manière à trier dans l'ordre que tu souhaites
    L'ordre naturel.. comment spécifier cet ordre à IEqualityComparer ? Ou bien faut-il que je réécrive l'algo du tri naturel ?

  5. #5
    Membre éprouvé

    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
    Points : 945
    Points
    945
    Par défaut
    Justement, j'ai l'impression que ce que tu as trouvé sur StackOverflow est exactement ce que tu cherches. La dll permet de retourner le Compare() comme tu le souhaites.

    Tu peux c/c son code et le remercier ;p

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut
    J'ai implémenté ce code : http://www.davekoelle.com/alphanum.html

    Il fonctionne bien pour moi Il émule en quelque sort la dll de Windows.

    J'avais lu qqpart qu'il fallait - quand on pouvait - éviter d'utiliser directement les fonctions built-in de Windows en C#. Non ?

    Du coup je préfère la classe de DaveKoelle.

  7. #7
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par jeremm Voir le message
    J'avais lu qqpart qu'il fallait - quand on pouvait - éviter d'utiliser directement les fonctions built-in de Windows en C#. Non ?
    A moins de vouloir être multi-plateforme, ce qui ne se fait pas toujours aisément en fonction des bibliothèques utilisées (par exemple WPF n'existe pas chez mono, ni un certain nombre de providers ADO.Net), il n'y a aucune raison de se passer des API windows quand on en a besoin.

    Une bonne part des librairies du framework sont des wrappers autours des API de windows (win forms, les api réseau, I/O, ...)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 310
    Points : 132
    Points
    132
    Par défaut
    OK merci.
    Finalement j'opte pour la dll, j'ai comparé et le tri est plus rapide !

    @+

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

Discussions similaires

  1. [KSH] Script pour trier des fichier dans des répertoires par mois
    Par MsieurDams dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 08/08/2014, 14h32
  2. [Turbo Pascal] Trier des nombres saisis dans un fichier texte
    Par rasedra dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 30/07/2008, 10h12
  3. des fichiers comme arguments dans le main
    Par adel.87 dans le forum Débuter
    Réponses: 1
    Dernier message: 27/12/2007, 14h42
  4. Intégration des fichier XML dans une base de données MySQL
    Par bebemoundjou dans le forum XQUERY/SGBD
    Réponses: 8
    Dernier message: 25/11/2005, 22h41
  5. [MFC] Ajout des fichiers récents dans un menu
    Par Choupinou dans le forum MFC
    Réponses: 3
    Dernier message: 20/08/2004, 16h47

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