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

Lazarus Pascal Discussion :

Comportement bizarre de FindFirst et FindNext sous Ubuntu


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Comportement bizarre de FindFirst et FindNext sous Ubuntu
    Bonjour à toutes et à tous,

    Dans un programme, j'utilse FindFirst et FindNext pour charger des images. Les noms des dossiers et des fichiers images (jpg) sont des nombres. Exemple dossier '256' et image '184.jpg'.

    Lorsque j'utilise un explorateur de fichiers, je les vois bien en ordre croissant, que j'ai choisi un tri par nom ou par date.

    Sous Ubuntu, FindFirst et FindNext, aussi bien sur les dossiers que les fichiers, charge ces dossiers et ces fichiers dans un ordre qui n'est pas l'ordre croissant affiché par l'explorateur. Sous Windows: pas de problème.

    Avez-vous rencontré ce problème, y a-t-il une solution ?

    Cordialement.

    Pierre

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    Il n'a jamais été stipulé nulle part que les fonctions FindFirst et FindNext retournent les noms de fichiers classés par ordre alphabétique, et ce, y compris sous Windows !

    Les fonctions FindFirst et FindNext renvoient les noms de fichiers dans l'ordre dans lequel le système de fichiers sous-jacent décide, et veut bien, de les fournir. Toute supposition de votre part d’un ordre établi, en l’occurrence, un ordre alphabétique, serait hasardeuse !

    Pour résoudre ce problème, une technique commune, consiste à stocker les fichiers ainsi que leurs caractéristiques (date création, taille, etc.), dans une liste d’objets, voire même dans une simple TStringList s’il s’agit uniquement des noms de fichiers, puis de classer les objets de la liste selon une fonction personnalisée de votre choix, définie par vous-même, puis passer la dite fonction de tri à la méthode TStringList.CustomSort.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par hmira Voir le message
    ... voire même dans une simple TStringList s’il s’agit uniquement des noms de fichiers, ...
    A+
    Bon, puisque FindFirst et FinNext n'en font qu'à leur tête , je vais utiliser le TStringList et sa possibilité de tri. C'est d'ailleurs ce que j'avais envisagé comme solution.

    Cordialement.

    Pierre

  4. #4
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Re-bonjour Pierre

    Si jamais dans l'unité FileUtil il y a une fonction déjà prête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function FindAllFiles(const SearchPath: String; SearchMask: String = '';
      SearchSubDirs: Boolean = True; DirAttr: Word = faDirectory): TStringList;
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci BeanzMaster pour ce "FindAllFiles" dont je me servirai certainement dans d'autres cas.

    Dans mon cas présent, j'ai un masque un peu spécial : les noms de répertoires et fichiers trouvés doivent être un nombre. La fonction "FindAllFiles" convient, mais ne me simplifie pas ici la tâche. Donc, je reste avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          if FindFirst ('*', faDirectory, InfoRep)= 0 then
          repeat
            if TryStrToInt(InfoRep.Name, x) then  // Teste si le nom du répertoire est un nombre
                ListeDeNom.Add(InfoRep.Name);
          until FindNext(InfoRep) <> 0;
          FindClose(InfoRep);
          ListeDeNom.CustomSort(CompareInt); // Je les remets dans un ordre croissant
          ...
    Cordialement.

    Pierre

Discussions similaires

  1. compilation sous ubuntu 16 bizarre
    Par turboiii dans le forum Ubuntu
    Réponses: 0
    Dernier message: 16/03/2017, 21h18
  2. PhpMyAdmin vs Mysql sous Ubuntu
    Par PiTiLeZarD dans le forum Installation
    Réponses: 11
    Dernier message: 12/01/2005, 22h02
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 10h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 15h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

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