Application.StartupPath() vs Directory.GetCurrentDirectory()

Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
- - Dernière réponse : scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
- 1 oct. 2008 à 13:09
Glop glop,

avant qu'il ne me reste plus un cheveu sur le crâne je viens demander un peu d'aide.

Ces 2 fonctions ne retournent pas la même chose.
Application.StartupPath()
Directory.GetCurrentDirectory()

Sur mon poste en Vista le premier  me donne le 'path de mon projet\bin\Debug'.
L'autre donne 'path de mon projet' (normal puisque j'ai changé au niveau du projet le lieu d'execution)
Ce changement est volontaire car j'ai un dossier \Apps en sous dossier de mon projet et je veux donc qu'il soit accessible en Debug et Release.

Sur une VM avec InnoSetup, le fichier doit se coller dans le HKLM\Run ce qu'il fait bien :
C:\Program Files\Company\MySoft\SupportTray.exe

Or au lancement du soft sur la VM, pour le GetCurrentDirectory il me sort un path exotique (sous 2K Pro) :
c:\Documents and Settings\Administrateur
donc :
c:\Documents and Settings\Administrateur\.\Apps\Toto.exe
ne se lance pas.

Et si j'utilise Application.StartupPath, c'est sous VisualStudio que ca ne marche vu que le path ne contient pas le dossier Apps.

HELPPPPPPP

----------------------------
C++ forever
C# amateur
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
51
1
Merci
Hello,

En effet, il ne faut pas confondre les deux.
Application.StartupPath retourne bel et bien le chemin de l'exe.

Directory.GetCurrentDirectory retourne un répertoire de travail. Ce dernier peut être changé dans le code avec la propriété Environment.CurrentDirectory. Je crois même, mais sans en être certain, qu'un OpenFileDialog (ou un des autres dialogues de cette catégorie) modifie cette variable en fonction du fichier sélectionné.

Ce que tu peux faire, c'est un depuis VS, regarder les propriété des fichiers contenus dans ton dossier Apps. Tu mets "Build Action" à Content, et "Copy to output directory" à "Copy always".

De cette manière, lors de la compilation, VS va créer un dossier Apps dans bin/debug ou dans bin/release, avec les fichiers dont tu auras changé les propriétés indiqués.

Une autre possibilité est de les inclure en tant que resources.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 213 internautes nous ont dit merci ce mois-ci

Commenter la réponse de SharpMao
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
en fait, il semblerait que ce soit :
Directory.GetCurrentDirectory()
qui renvoie :
'C:\Documents and Settings\Administrateur'

au lieu de retourner le path ou se trouve l'exe.
Commenter la réponse de scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
Ce serait une solution en effet même si ca fait dupliquer les données.

Mais ce que je voudrais comprendre c'est pourquoi je me retrouver sous 2KPro avec ce path (c:\Documents and Settings\Administrateur) lors de l'appel à GetCurrentDirectory (). alors que la clé dans le HKLM\run indique bien le chemin complet de l'exe.

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
je viens de faire le test avec le code suivant :
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;
using System.Diagnostics;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string strMessage;
            strMessage = string.Format("Process.GetCurrentProcess().MainModule.FileName      : '{0}'", Process.GetCurrentProcess().MainModule.FileName);
            DbgWriteLine(strMessage);
            strMessage = string.Format("System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)   : '{0}'", System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
            DbgWriteLine(strMessage);
            strMessage = string.Format("Directory.GetCurrentDirectory: '{0}'", Directory.GetCurrentDirectory());
            DbgWriteLine(strMessage);
        }

        static void DbgWriteLine(string message)
        {
            StreamWriter output = new StreamWriter("MyLog.txt", true, Encoding.Default);

            output.WriteLine(message);
            Console.WriteLine(message);

            output.Close();
        }
    }
}

Avec le fichier de registre suivant :
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"TST"=""c:\\remote\\ConsoleTest.exe""

Et en plaçant l'exe généré dans
C:\remote

Il me colle mon fichier de log Mylog.txt dans :
C:\Documents and Settings\Utilisateur

(Idem sur XP Pro en machine virtuelle avec toutes les MaJ Windows update)
Commenter la réponse de scoubidou944
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
Je viens de faire le test en Win32 :

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        internal static extern uint GetCurrentDirectory(uint nBufferLength,
        [MarshalAs(UnmanagedType.LPTStr)]StringBuilder path);

[...] Main ()

StringBuilder sb = new StringBuilder(256);
GetCurrentDirectory(256, sb);
string Name = sb.ToString();

strMessage = string.Format("Win32.GetCurrentDirectory: '{0}'", Name);
DbgWriteLine(strMessage);

Même résultat.
Commenter la réponse de scoubidou944
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
51
0
Merci
Oui, et c'est normal,

CurrentDirectory n'a rien a voir avec le chemin de l'application, de windows, ou d'une quelconque entrée du registre.
Il ne faut pas s'y fier pour retrouver des informations nécessaires à ton programme.
Même la doc microsoft le dis : "Le répertoire actif est distinct du répertoire d'origine qui est celui à partir duquel le processus a été démarré."
Le répertoire actif étant ce qui est retourné par cette méthode.
Un autre moyen, si tu ne veux pas copier les fichier dans la sortie, c'est d'ajouter un paramètre dans un fichier de config.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
728
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
0
Merci
oui je pense que je ne vais pas y couper.
n'empeche que c'est super bizarre que le CurrentDirectory soit collé à cet emplacement.

----------------------------
C++ forever
C# amateur
Commenter la réponse de scoubidou944