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 :

La fonction FileExists fonctionnerait-elle à l'envers ? [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 087
    Par défaut La fonction FileExists fonctionnerait-elle à l'envers ?
    Bonjour,

    je suis en train de migrer doucement vers 64 bits, et ce n'est pas gagné, la preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      Ini: TIniFile;
    begin
      Ini := TiniFile.Create(lowercase(ChangeFileExt(paramstr(0), '.ini')));
      ShowMessage(Ini.FileName); // impeccable
      if not FileExists(Ini.FileName) then exit;
    Vous avez compris, après le ShowMessage qui m'affiche une bonne valeur, la ligne suivante me fait sortir, donc FileExists retourne False et comment cela est-il possible ?
    Il n'y a pas d'accents, pas d'espaces, pas de mix majuscules-minuscules, et le test échoue…

    Une idée ? Une explication ?

    Debian Buster 10.5, FPC 3.2, Laz 2.0.10

    EDIT : c'était un problème de gestion de la casse du path du fichier, hé oui… /EDIT

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 087
    Par défaut
    Après des tests, il semblerait que le problème soit plutôt lié au TIniFile qu'à FileExists :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    showmessage(
        p + ChangeFileExt(ExtractFileName(Application.ExeName), '.ini') + CRLF +
        ChangeFileExt(paramstr(0), '.ini') + CRLF +
        Ini.FileName);
    Nom : showmessage-3lignes.png
Affichages : 305
Taille : 8,7 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not FileExists(p + ChangeFileExt(ExtractFileName(Application.ExeName), '.ini')) then exit; // OK
    if not FileExists(ChangeFileExt(paramstr(0), '.ini')) then exit;   // OK
    if not FileExists(Ini.FileName) then exit;   // KC
    Et si je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      showmessage(inttostr(length(p + ChangeFileExt(ExtractFileName(Application.ExeName), '.ini')))
          + ' ' + inttostr(length(ChangeFileExt(paramstr(0), '.ini')))
          + ' ' + inttostr(length(Ini.FileName)));
    je vois simplement 54 54 54 -- j'espérais une différence, mais non.
    Un truc de grand malade, l'informatique…

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 087
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Après des tests, il semblerait que le problème soit plutôt lié au TIniFile qu'à FileExists
    Confirmé en ajoutant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      myIni: string;
    begin
      Ini := TiniFile.Create(lowercase(ChangeFileExt(paramstr(0), '.ini')));
      myIni :=  Ini.FileName;
    //...
      if not FileExists(myIni) then exit;   // KC
    Désolé pour le faux titre (bah, ça attirera les foules).

    Plus qu'à remonter le bug, après confirmation sous Windows, si qqun veut bien s'y coller.

  4. #4
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Confirmé en ajoutant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      myIni: string;
    begin
      Ini := TiniFile.Create(lowercase(ChangeFileExt(paramstr(0), '.ini')));
      myIni :=  Ini.FileName;
    //...
      if not FileExists(myIni) then exit;   // KC
    Désolé pour le faux titre (bah, ça attirera les foules).

    Plus qu'à remonter le bug, après confirmation sous Windows, si qqun veut bien s'y coller.
    Salut attention avec Ini := TiniFile.Create(lowercase(ChangeFileExt(paramstr(0), '.ini'))); le fichier n'est pas de suite créé si il n'existe pas. Il faudra d'abord y écrire une donnée ini.WriteString('SECTION1','PARAMS1','1.0'); pour que le fichier soit écrit sur le disque.

    Donc si ton fichier n'est pas présent au lancement c'est normal que "FileExists" retourne faux

    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
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 087
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Donc si ton fichier n'est pas présent au lancement c'est normal que "FileExists" retourne faux
    Mais ce n'est pas le cas !
    , tu as dû lire trop vite, ou c'est la chaleur : le fichier existe parfaitement puisque le ShowMessage montre bien 3 lignes identiques issues de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    showmessage(
        p + ChangeFileExt(ExtractFileName(Application.ExeName), '.ini') + CRLF +
        ChangeFileExt(paramstr(0), '.ini') + CRLF +
        Ini.FileName);
    En plus je sais qu'il est là puisqu'une fonction WriteValue fonctionne bien, en ouvrant ensuite le fichier (qui donc existe ) avec un bloc-notes, je vois bien la valeur écrite dedans.

    Il y a une blague quelque part avec le TInifile

  6. #6
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Mais ce n'est pas le cas !
    , tu as dû lire trop vite, ou c'est la chaleur : le fichier existe parfaitement puisque le ShowMessage montre bien 3 lignes identiques issues de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    showmessage(
        p + ChangeFileExt(ExtractFileName(Application.ExeName), '.ini') + CRLF +
        ChangeFileExt(paramstr(0), '.ini') + CRLF +
        Ini.FileName);
    Non, non j'ai bien lu et j'ai fais le test sous Win
    En fait non, car ici tu déduis le nom du fichier dans une chaîne, cela ne signifie pas qu'il existe.

    Citation Envoyé par Jipété Voir le message
    En plus je sais qu'il est là puisqu'une fonction WriteValue fonctionne bien, en ouvrant ensuite le fichier (qui donc existe ) avec un bloc-notes, je vois bien la valeur écrite dedans.

    Il y a une blague quelque part avec le TInifile
    Justement le fichier est écrit que lorsque tu utilise une des fonctions "Write", le fichier n'est pas créer (écrit sur le disque') avec "Create". Mais bon une fois qu'il est là, cela ne devrait pas poser de problème

    je ne pense pas que ce soit dans inifiles car on voit ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    constructor TCustomIniFile.Create(const AFileName: string; AOptions : TIniFileOptions = []);
    begin
      FFileName := AFileName;
    A mon avis c'est la fonction "lowercase" qui pose probleme (d'encodage) avec les "_". Plusieurs solutions à essayer :
    1) Avec une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Var
      IniFileName : String;
    begin
      IniFileName := lowercase(ChangeFileExt(paramstr(0), '.ini'));
      Ini := TiniFile.Create(IniFileName);
      if not FileExists(IniFileName) then exit;
    Si ici ça fonctionne c'est qu'il y a bien un soucis quelque part dans IniFile avec la variable FFileName (EDIT : ou c'est du fait que dans le Create c'est le const du paramètre "AFileName: string" qui "embrouille" l'assignation via la fonction LowerCase)

    2) Essayes : lowercase(ChangeFileExt(paramstr(0), '.ini'), loInvariantLocale);
    3) Rajoutes l'unité LazUTF8 et utilises la fonction "UT8LowerCase" à la place.
    4) Rajoutes les unités "LazUTF8" et "LazFileUtils" et à la place de "FileExists" essayes avec "FileExistsUTF8"

    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

  7. #7
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Nom : showmessage-3lignes.png
Affichages : 305
Taille : 8,7 Ko
    Tiens un truc bizarre, que je viens de remarquer dans ta capture, on dirait qu'il manque un caractère dans la dernière ligne. On voit un écart d'alignement à la fin sur cette dernière
    • "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

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 564
    Par défaut
    Bonsoir.

    Il ne manque pas de caractères sur la dernière ligne, le décalage vient du fait que la ligne est toute en minuscule alors que les deux premières on une majuscule (wFrames).

  9. #9
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ddaime Voir le message
    Bonsoir.

    Il ne manque pas de caractères sur la dernière ligne, le décalage vient du fait que la ligne est toute en minuscule alors que les deux premières on une majuscule (wFrames).
    Bonsoir

    Oulala je suis fatigué moi, bien vue

    Ton soucis vient de là JP ! Vue que linux est sensible à la casse On est tous les deux dans les choux pour le coup

    Merci ddaime

    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

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 087
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Oulala je suis fatigué moi, bien vu
    C'est la chaleur.
    Moi, en fin de journée, je n'arrive plus à réfléchir.

    Citation Envoyé par BeanzMaster Voir le message
    Ton souci vient de là JP ! Vu que linux est sensible à la casse On est tous les deux dans les choux pour le coup
    Et effectivement, malgré la copie d'écran, cette différence F/f je ne l'ai pas vue, même si j'avais remarqué le défaut d'alignement au bout à droite.
    Et pour tout dire, j'avais carrément ouvert le png dans Gimp + zoom à 200 % pour tout regarder attentivement, et F/f est passé à la trappe. Incroyable !

    Quant à l'existence du fichier .ini, j'allais péter un câble car il existe depuis des années, là c'est un autre programme que je migre de 32 à 64 bits.

    Bien vu, ddaime

  11. #11
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 087
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 087
    Par défaut
    Testé et validé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Ini := TiniFile.Create(LowerCase(ChangeFileExt(paramstr(0), '.ini')));
    // des fois on se prend  ^^^^^^^^^ les pieds dans le tapis sans savoir pourquoi ni comment
      Ini := TiniFile.Create(          ChangeFileExt(paramstr(0), '.ini') );  // +1 !
      if not FileExists(Ini.FileName) then exit; // et mon fichier .ini est bien détecté.
      // tout va bien, on continue
    Si un modo passe par là, il peut, s'il le souhaite, supprimer toute cette discussion, qui n'a plus lieu d'être.

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

Discussions similaires

  1. la fonction run est elle obligatoire ?
    Par asoka13 dans le forum Applets
    Réponses: 6
    Dernier message: 13/11/2009, 09h33
  2. Réponses: 17
    Dernier message: 05/02/2009, 15h48
  3. La fonction display est-elle fonctionnelle sous ie7
    Par develop' peur ! dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/02/2008, 17h42
  4. Réponses: 3
    Dernier message: 04/03/2007, 09h34
  5. La fonction fgets est-elle compatible Windows/Unix ?
    Par ashurai dans le forum Langage
    Réponses: 1
    Dernier message: 05/04/2006, 17h59

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