Application.StartupPath() vs Directory.GetCurrentDirectory()

scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017 - 30 sept. 2008 à 19:41
scoubidou944 Messages postés 714 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
A voir également:

7 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
1 oct. 2008 à 06:47
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)
1
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
1 oct. 2008 à 02:00
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.
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
1 oct. 2008 à 09:30
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
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
1 oct. 2008 à 10:49
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
1 oct. 2008 à 12:10
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.
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
1 oct. 2008 à 12:18
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)
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
1 oct. 2008 à 13:09
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
0
Rejoignez-nous