web-dev-qa-db-fra.com

C # Comment obtenir le chemin du répertoire actuel

Scénario: J'ai créé un projet de bibliothèque fournissant une interface au programme d'installation (le fichier exe créé à l'aide du bouclier d'installation) .Je veux vérifier si un fichier particulier existe dans le dossier du programme d'installation.

J'ai essayé de suivre:

1).  Assembly.GetEntryAssembly().Location

// Lance "La référence d'objet n'est pas définie sur une instance d'objet"

2). new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath

// revenir : C:\Windows\Microsoft.Net\Assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

3). Assembly.GetExecutingAssembly().Location

// retourne une chaîne vide

4). AppDomain.CurrentDomain.BaseDirectory

// retourne "C:\Windows\syswow64 \" quel que soit le chemin d'accès

Quelqu'un pourrait-il me dire comment puis-je obtenir le chemin du répertoire à partir duquel le programme d'installation est exécuté?

3
Vishwas Trivedi

Je vais répondre à ma propre question, il n'est pas possible d'obtenir le chemin actuel du projet de bibliothèque. Vous devrez l'obtenir de l'installateur. Il n'y a pas d'autre moyen.

Je vous remercie.

0
Vishwas Trivedi

Vous pouvez utiliser

Directory.GetCurrentDirectory();

obtenir le chemin du répertoire courant

importer System.IO

3
Mostafiz

En supposant que vous exécutez une installation MSI construite par InstallShield:

Le problème que vous rencontrez est dû à la façon dont ces appels fonctionnent. Vous l'implémentez dans une DLL externe, et les DLL n'ont pas leur propre répertoire actuel - elles ont le répertoire actuel du processus qui appelle la Dll. Dans ce cas, vous êtes appelé à partir d'un processus msiexec.exe (en supposant que vous le fassiez dans une action personnalisée) afin d'obtenir le répertoire actuel de msiexec.exe. 

En dehors de cela, quelques autres observations:

  1. Vous ne dites pas exactement quand vous appelez votre code, mais cela se produit peut-être avant que l'utilisateur ait choisi le dossier d'installation. La recherche n'aide donc pas vraiment.

  2. InstallShield fournit probablement un support pour une recherche de fichier. S'il s'agit d'une configuration MSI, c'est le cas. 

  3. Les installations recherchent rarement des fichiers dans un dossier d’installation car il existe rarement une bonne raison. Si vous avez besoin du fichier, ajoutez-le à votre installation, ou s'il s'agit d'un fichier redistribuable, ajoutez le package redist standard, peut-être un module de fusion. Si ce fichier appartient à une autre configuration, que ferez-vous si ce produit est désinstallé? Vérifiez-vous la version pour voir si elle est compatible avec votre application? En général, toutes les configurations installent les fichiers dont elles ont besoin et les fichiers partagés sont rétrocompatibles si elles sont utilisées par plusieurs produits différents. 

1
PhilDW

Si vous voulez obtenir le dossier où repose votre exe

AppDomain.CurrentDomain.BaseDirectory

cela renvoie le chemin complet au dossier qui contient l'exe. De là, vous pouvez ajouter vos dossiers manuellement

AppDomain.CurrentDomain.BaseDirectory + @"MyFolder1\MyFolder2";
0
Shmosi

Si vous voulez que ce chemin dans InstallShield utilisez ceci

Setup.exe - Utilise la propriété SETUPEXEDIR

http://www.installshield.com/news/newsletter/0206-articles/SetupExeDir.asp .

Selon la version de installshield que vous utilisez, essayez différentes propriétés.

1. SRCDIR

2. SETUPEXEDIR

3. SUPPORTDIR

Si vous avez un code C # pour lire les pré-propriétés, utilisez MsiGetProperty comme ci-dessous

MsiGetProperty (hMSI, "SETUPEXEDIR", Valeur, Taille)

0
ManishM

Essayez celui-ci, ça marche toujours pour moi: 

Environment.CurrentDirectory

utiliser la propriété ci-dessus comme suit.

string currentDirectory = Path.GetDirectoryName(Environment.CurrentDirectory);
0
ksdev