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

Discussion: Obtenir le path du dossier [Lazarus]

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 38
    Points : 27
    Points
    27

    Par défaut Obtenir le path du dossier

    Bonjour,

    J'ai créé un programme sous Delphi que j'utilise pour gérer différents fichiers ayant la même structure.
    Pour cela, j'ai l'arborescence suivante :

    - Dossier Application
    Programme PGM (mon programme)
    - Dossier fichiers1
    lien vers PGM
    - Dossier Database
    - Dossier fichiers2
    lien vers PGM
    - Dossier Database
    - Dossier fichiers3
    lien vers PGM
    - Dossier Database
    - Dossier fichiers4
    lien vers PGM
    - Dossier Database
    etc...

    Quand j'apporte des modifications à mon programme, cette structure me permet de n'avoir à remplacer que le programme contenu dans le dossier "Dossier Application".

    Pour l'exécution, j'utilise des raccourcis où il me suffit d'appeler le lien contenu dans tel ou tel dossier. Dans mon programme Delphi, je récupère le path du dossier fichiersn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WCheminExe := ExtractFilePath(ParamStr(0));
    Ensuite, pour paramétrer le chemin de mes fichiers, je n'ai plus qu'à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WCheminDatabase := WCheminExe + 'Database/';
    Tout cela fonctionne parfaitement.

    Je suis passé sous Linux depuis plusieurs années (Fedora 29, environnement XFCE). Mon programme (Delphi) est exectué sous Wine. J'ai créé des lanceurs qui appellent eux aussi le lien du Programme PGM. Tout cela fonctionne comme avant.

    Et c'est maintenant que ça se complique :
    J'ai repris mon programme avec Lazarus (Linux), et là, plus moyen d'obtenir le path du dossier contenant le lien (dossier contenant "dossier Database"). J'obtiens à la place le chemin de l'exécutable ("Dossier Application"). J'ai fait moult recherches, mais je n'ai toujours pas trouvé LA solution.

    Jai trouvé cette solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WCheminExe := FExpand(WFilePath); (mettre DOS dans les uses)
    Ça fonctionne bien si je clique directement sur le lien, dans le dossier "fichiern". Mais ce n'est pas une solution pratique. Et quand je crée un lanceur (comme pour le même programme Delphi/Windows sous Wine), j'obtiens "/home/moi".
    J'ai essayé de créer un petit programme bash pour initialiser un petit fichier contenant le résultat de la commande PWD, fichier que je lis au début de mon programme. Le fichier se crée bien avec le bon dossier. Problème, quand le lance mon programme à partir du lanceur, mon programme Lazarus ne peut retrouver ce fichier.
    J'en déduis que dans tous les cas, le path actif est celui du lanceur.

    Je pense à ces options :
    1) créer un programme Lazarus qui retrouve le bon path et appelle directement le programme PGM avec passage de paramètres. Le lanceur n'aurait qu'à appeler ce petit programme.
    2) utiliser une variable d'environnement.

    Autre solution possible ?
    Mais pourquoi donc ce qui fonctionnait parfaitement avant me pose tant de problèmes ?

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 318
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 318
    Points : 11 784
    Points
    11 784

    Par défaut

    Salut,

    j'ai pas tout compris (c'est touffu et il fait trop chaud), note simplement qu'il existe les commandes Application.Location et ProgramDirectory, qui renvoient des chaînes de caractères, à tester.

    Nom : Capture du 2019-07-11 18:55:22.png
Affichages : 83
Taille : 17,4 Ko
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 38
    Points : 27
    Points
    27

    Par défaut

    Merci Jipété pour la réponse.
    En très bref, ce que je veux obtenir, ce n'est pas le dossier de la cible du lien (l'exécutable), mais le dossier du lien lui-même Ça fonctionne bien sous windows, et aussi avec le programme windows sous linux (avec wine).

    J'ai testé les solutions que tu me proposes. Ci-dessous, le code du programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      WCheminExe1 := ExtractFilePath(ParamStr(0));
      WCheminExe2 := Application.Location;
      WCheminExe3 := ProgramDirectory;
      ShowMessage('Exe1 : ' + WCheminExe1 + #13
                  +'Exe2 : ' + WCheminExe2 + #13
                  +'Exe3 : ' + WCheminExe3 + #13);
      Application.Terminate;
    end;
    Le contenu de lanceur
    Nom : Lanceur.png
Affichages : 56
Taille : 36,0 Ko
    Ci-dessous le dossier dans lequel j'ai placé le lien
    Nom : Dossier_Home.png
Affichages : 57
Taille : 32,8 Ko
    Et le resultat quand j'execute à partir du lanceur
    Nom : Resultat.png
Affichages : 58
Taille : 22,9 Ko
    J'obtiens strictement la même chose, que je lance project1 à partir de l'objet ou à partir du lien.
    Ce que j'obtenais avant, c'était par ex "/home/moi/Test_Dir" et c'est ce qui m'intéresse.

    Cette différence doit être liée aux différences entre dlphi et lazarus ?

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 318
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 318
    Points : 11 784
    Points
    11 784

    Par défaut

    Salut,

    Pas trop d'idées, désolé…

    Citation Envoyé par micoudic Voir le message
    Cette différence doit être liée aux différences entre delphi et lazarus ?
    Plutôt entre Windows où les raccourcis sont des vrais fichiers (.lnk) et Linux où ils sont je ne sais pas trop quoi, peut-être un champ de la structure du fichier, dont le contenu est bien visible en console avec ls -Al comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (4 premiers champs supprimés) 63 juin  26  2017 RGBChoose -> /datas/Rangement/Coding/Lazarus/colors/Color Selector/RGBChoose
    La flèche -> indique que "l'objet" RGBChoose présent dans le dossier en cours d'examen pointe vers /chemin/binaire.
    Et l'on constate que le champ 5 indique 63, ce qui correspond au nombre de caractères du dernier champ.

    Si c'est un besoin absolu, tu pourrais t'en sortir en récupérant ce dernier champ + un peu de traitement.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 38
    Points : 27
    Points
    27

    Par défaut

    Merci Jipété,
    J'ai résolu le problème (est-ce la meilleure solution ? ) en créant un petit programme (lazarus aussi, tant qu'on y est), dans lequel je récupère le dossier où il est installé, puis je lance un process pour appeler mon programme, en lui filant le chemin en paramètre.
    Je place donc ce petit programme dans chacun des dossiers, en remplacement des liens. C'est juste que ça me prend 1,5Mo à chaque fois, au lieu de 56 Bytes par lien.

    Note : J'avais recherché une solution du coté de bash. Peut-être avec une syntaxe que je ne connais pas, mais je ne suis pas arrivé à mes fins.
    (ls -Al me donne le path de l'objet pointé. J'ai essayé aussi avec "readlink", mais ça donne aussi le path de l'objet pointé par le lien)

    Encore merci pour l'attention portée à mon pb.

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 318
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 318
    Points : 11 784
    Points
    11 784

    Par défaut

    Citation Envoyé par micoudic Voir le message
    Je place donc ce petit programme dans chacun des dossiers, en remplacement des liens. C'est juste que ça me prend 1,5Mo à chaque fois, au lieu de 56 Bytes par lien.
    Fais une application console en pur FPC, tu devrais tomber à 200 ko (de mémoire et à la louche).

    Citation Envoyé par micoudic Voir le message
    Note : J'avais recherché une solution du coté de bash. Peut-être avec une syntaxe que je ne connais pas, mais je ne suis pas arrivé à mes fins.
    (ls -Al me donne le path de l'objet pointé. J'ai essayé aussi avec "readlink", mais ça donne aussi le path de l'objet pointé par le lien)
    J'ai tenté ça mais attention !, les espaces vont poser problème, s'il y en a dans la cible. À creuser…
    Sinon, en partant d'un exemple sans espaces (le > symbolise le prompt de la console) :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    > progname="project1"
    > ls -Al | grep $progname
    (4 premiers champs supprimés) 48 juin  26  2017 dfm2txt -> /datas/Rangement/Coding/Lazarus/dfm2txt/project1
    > declare -a chemin=($(ls -Al | grep $progname))
    > temp=${chemin[10]}
    > echo ${temp%%$progname}
    /datas/Rangement/Coding/Lazarus/dfm2txt/
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 38
    Points : 27
    Points
    27

    Par défaut

    La commande "ls" retourne le dossier de la cible et non le dossier du lien. 'readlink" ne fait pas mieux
    Il exixte peut-être d'autres commandes, mais je ne connais pas.

  8. #8
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    3 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 3 778
    Points : 9 173
    Points
    9 173

    Par défaut

    Bonjour

    À mon humble avis ce que tu fais est crasseux. La seule chose qu'a à connaître une application, c'est le dossier courant dans lequel on travaille. Si tu grapilles des infos sur l'exécutable, c'est que ton logiciel est mal installé ou mal conçu. C'est d'autant plus vrai si tu cherches le lien symbolique qui a lancé l'exécutable. D'ailleurs, j'aimerais bien savoir ce que renvoie Delphi quand plusieurs liens physiques Linux pointent sur l'application.

    Mais, pour ne pas être 100% négatif, je te donne une commande bash, qui cherche dans tout le système les liens symboliques qui pointent sur ton exécutable. Tu feras ton choix dans les résultats possibles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -P / -type l -lname "/datas/Rangement/Coding/Lazarus/dfm2txt/project1" 2>/dev/null

    Je le répète : revois ta méthode. Elle n'est pas bonne. Seul le dossier de travail compte.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
    Votre problème est résolu ? Cliquez sur en bas de page.

    Linux, grep/sed/awk/xml... et autres fichiers plats, Java, C++

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    avril 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 38
    Points : 27
    Points
    27

    Par défaut

    Jipété, j'ai enfin trouvé la solution. J'ai presque honte tellement c'est simple :

    Au lieu de placer un lien dans chacun des dossiers contenant les fichiers à traiter, lien qui pointe sur l’exécutable, ce qui me renvoie inlassablement le dossier "/home/nom_de_user",
    j'ai cré le scipt suivant (]Test_Appel_Pgm_1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/sh
    /mnt/sdb5/Oud/Annonces/Annonces $PWD/
    Je récupère le dossier du script que je passe en paramètre à mon programme.

    Ensuite, je reviens sur mon lanceur que je codifie ainsi
    Nom : Capture d’écran.png
Affichages : 22
Taille : 39,2 Ko

    Et oui, il faut juste documenter dans le lanceur la ligne "répertoire de travail"

    Rappel de ma structure

    - dossier_Annonces
    Annonces (le programme executable)
    - dossier_Machines_Outils (cette structure est répétées n fois)
    Test_Appel_Pgm_1 (Le scipt bash)
    - dossier_Database
    mes fichiers
    - dossier_Images
    mes fichiers
    - dossier_Memos
    mes fichiers

    Désolé de t'avoir fait travailler autant. Enfin, si ça peut servir.
    J'ai été couilloné, parcequ'avec delphi et wine, il me fallait documenter cette ligne avec le dossier contenant "BDE".

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 318
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 318
    Points : 11 784
    Points
    11 784

    Par défaut

    Citation Envoyé par micoudic Voir le message
    Jipété, j'ai enfin trouvé la solution. J'ai presque honte tellement c'est simple :
    Admettons (j'avoue ne pas avoir creusé en profondeur).
    Ce qui m'ennuie, c'est ce que dit Flodelarab, car en général c'est toujours plein de bon sens, et lui a dû voir un truc qui t'a échappé et que je n'ai pas du tout capté.
    Citation Envoyé par Flodelarab Voir le message
    Je le répète : revois ta méthode. Elle n'est pas bonne. Seul le dossier de travail compte.
    Tu devrais y réfléchir posément.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. Obtenir le path du dossier
    Par micoudic dans le forum Linux
    Réponses: 0
    Dernier message: 11/07/2019, 10h29
  2. Obtenir le Path
    Par 4lkaline dans le forum Langage
    Réponses: 1
    Dernier message: 06/11/2006, 12h12
  3. [Struts] obtenir le path de l'application
    Par pouss dans le forum Struts 1
    Réponses: 8
    Dernier message: 11/05/2006, 10h37
  4. obtenir le path complet d'un processus en fonction de son PID
    Par violent_ken dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/05/2006, 16h43
  5. Réponses: 2
    Dernier message: 22/06/2004, 17h09

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