Retour au répertoire racine de Delphi exécutable
J'ai un Delphi application d'exécution et lorsque j'appelle GetCurrentDir
la suivante retourne:
C:\dev\w32\2015\BCSLBDemo\Win32\Debug
Quand je l'appelle ExtractFileDir(GetCurrentDir())
j'ai le message suivant:
C:\dev\w32\2015\BCSLBDemo\Win32
Ce que je désire est C:\dev\w32\2015\BCSLBDemo
function RetRoot: string;
var
i: Integer;
buf: string;
begin
Result := '';
buf := ExtractFileDir(GetCurrentDir());
i := Length(buf);
repeat
dec(i);
until (buf[i] = '\') or (i < 3);
if buf[i] = '\' then
begin
Delete(buf, i, Length(buf));
Result := buf;
end;
end;
J'ai écrit cette fonction pour obtenir le résultat souhaité. Je voudrais savoir si il y a une meilleure approche pour accomplir récupérer le répertoire racine d'un Delphi exécutable.
- Je suppose que vous devez définir ce que vous entendez par le répertoire racine d'un Delphi exécutable. Supposons que vous copiez l'exécutable dans un dossier dans le répertoire program files, comme vous le feriez si vous l'avez installé. Quel serait le répertoire racine. FWIW, le répertoire courant est seulement une coïncidence le même répertoire que l'exécutable est dans. Il n'a pas à être. Votre traitement de texte de code est très inutile. Vous pouvez supprimer tous les et de le remplacer avec la norme des appels de fonction.
- Donc, vous pouvez écrire
ExtractFileDir(ParamStr(0))
pour obtenir le répertoire contenant l'exécutable. Et à l'étape deux répertoiresExtractFileDir(ExtractFileDir(ExtractFileDir(ParamStr(0))))
. Mais pourquoi voulez-vous à l'étape deux répertoires? Qui semble plaine bizarre. Si vous voulez mieux vous aider, alors vous devez expliquer ce que vous allez faire avec cette information. - David, je crois que je sais comment faire ces choses. Votre réponse a été exceptionnelle. Je n'ai pas eu le temps de regarder dans votre offre ce en raison du feu incessant des appels. Où est la documentation expliquant les choses que vous mentionnez? Merci Arch
- "C:\dev\w32\2015\BCSLBDemo\Win32\Debug ... Ce que je désire est C:\dev\w32\2015\BCSLBDemo" - pourquoi?
BCSLBDemo
est votre racine du projet, pas votre exécutable racine. Votre executable est en cours d'exécution à partir de laWin32\Debug
dossier, parce que c'est là le le projet est configuré pour envoyer le fichier exécutable qu'il crée. Le executable n'a pas de notion de le projet. Si ce que vous essayez d'accomplir en ayant la executable de trouver le le projet root? Qu'est ce qu'il va faire avec ce chemin? - J'ai besoin d'un emplacement pour charger un contrôle à partir d'un fichier texte. Lorsque je place le zip sur Embarcadero Code de la Centrale je n'ai jamais inclure le 32 bits, ni le 64 bit exécutable répertoires. Donc ce fichier texte a besoin d'une maison autre que l'exécutable de la racine. Les Options sont ensuite mis à disposition de la mise à jour de ce fichier texte. Cette approche élimine le besoin de recompiler l'application pour des raisons de modification de contenu.
- Vous avez obtenu la mauvaise solution dans ce cas. Choix possibles serait le même répertoire que l'exécutable, ou un sous-répertoire de l'application données ou de programme, dossiers de données.
- Il n'y a pas une telle chose comme "répertoire racine d'un Delphi exécutable". Votre choix dir est
..\..
Vous devez vous connecter pour publier un commentaire.
Il y a une autre façon:
Vous prendra deux niveaux comme vous pouvez le voir.
Bien sûr, cette seule réponse "comment obtenir 2 niveaux de" question. La question sur l'Exe de la racine est une sorte de non-sens. Vous pourriez juste besoin de configurer les paramètres de votre projet pour ne pas faire de la
Win32\Debug
dossiers ou déplacer vos fichiers de données en là 😉Vous pouvez obtenir le chemin complet de l'exécutable de l'application à l'aide de:
Pour un formulaire en fonction de l'application, vous avez également la
Application
objet disponible:Pour obtenir le chemin d'accès au fichier, sans le nom de fichier, vous pouvez envisager d'utiliser ExtractFileDir ou ExtractFilePath.
La différence entre les deux est que
ExtractFilePath
retuns le chemin avec le dernier délimiteur (/
ou\
) etExtractFileDir
tronque.Comme indiqué dans le David Heffernan's commentaire, plusieurs appels à
ExtractFileDir
permettre d'obtenir le répertoire parent:Avoir
C:\dev\w32\2015\BCSLBDemo\Win32\Debug\Project1.exe
vous pouvez obtenirC:\dev\w32\2015\BCSLBDemo
comme ceci:Application.ExeName
est mis en œuvre? Il estParamStr(0)
. Alors, pourquoi faire la distinction?ExtractFileDir
sont déjà indiquées dans votre commentaire...Vous pouvez obtenir le chemin complet de l'exécutable de l'application à l'aide de:
Delphi 2010 déclarer Utilise
SWSystem;
Delphi Xe déclarer Utilise
IWSystem ;
showmessage(gsAppPath);