2010-12-05 26 views
3

Je dois lire les données d'un fichier dans une application de console C#.
Ce qui fonctionne: new StreamReader(@"..\\..\myData.csv");Application console C#: fichier de référence sans .. .. nom de fichier

Problème: le travail ..\\..\ parce que mon fichier exe est dans le répertoire bin/Debug Quand je déploie mon projet le chemin ne fonctionne plus

Question: Comment Je référence myData.csv indépendamment de l'emplacement du fichier exe?

je l'avais espéré trouver une méthode qui retourne la 'racine' de mon application console Jusqu'à présent, j'essayé ce qui suit:

Process.GetCurrentProcess().MainModule.FileName
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location
Path.GetFullPath("bp.csv")
AppDomain.CurrentDomain.BaseDirectory
Directory.GetCurrentDirectory()

Toutes ces expressions me conduisent au répertoire du fichier exe pas à la racine.

Je viens de commencer à lire sur le stockage isolé, mais ce serait bien d'avoir quelque chose de plus simple. Des suggestions/recommandations?

+1

Que signifie "root" de votre application de console pour vous? – Gabe

+0

Lorsque vous déployez votre projet, où myData.csv est-il relatif à votre fichier .exe? Sera-t-il toujours sur le même chemin (absolu)? – Cameron

Répondre

2

Où votre myData.csv sera stocké? Vous devriez avoir un emplacement absolu de ce fichier.

il y a deux options

  1. Vous pouvez placer ce fichier dans le même répertoire dans lequel votre exe est placé de sorte que vous aurez seulement besoin de faire

    new StreamReader("myData.csv"); 
    
  2. vous pouvez définir l'emplacement du fichier dans le fichier App.Conig et lisez cet emplacement.

  3. Vous pouvez définir une variable de chemin et lire la variable PATH.

+1

'new StreamReader (" myData.csv ")' sera lu dans le répertoire de travail actuel, pas nécessairement depuis l'emplacement exe. –

5

L'option la plus simple est probablement ajouter votre fichier CSV à la solution et faites un clic droit dans VS et définir l'action de construction à « Copier si plus récent », qui sortira ensemble avec le .exe (à le dossier Debug ou Release) lors de la construction.

Dans le code, vous pouvez obtenir l'emplacement actuel de l'Assemblée exécution comme ceci:

string folder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 

Et vous pouvez combiner le chemin avec le nom du fichier CSV:

string filePath = Path.Combine(folder, "myData.csv"); 
+2

C'est l'approche correcte, mais 'Assembly.GetExecutingAssembly()' retournera réellement l'assembly qui contient la méthode actuelle, qui peut être une DLL et non l'EXE, et il peut résider dans un dossier séparé. 'GetEntryAssembly()' retournera l'assembly EXE. –

0

Vous devriez changez votre code pour

new StreamReader("myData.csv"); 

Cela garantira que les données sont toujours lues dans le même dossier le fichier .exe est exécuté à partir de.Après cela, vous pouvez créer une étape de post-construction pour copier le fichier dans le dossier de déploiement (ou dans un sous-dossier) afin que, même dans votre environnement de débogage, le fichier soit au bon endroit. La propriété "Copier dans le dossier de sortie" du fichier de données le fera également si vous avez juste besoin que le fichier soit dans le chemin de sortie d'un projet. Si vous avez besoin de plus de contrôle, vous pouvez utiliser les macros comme $ (ProjectPath) pour référencer l'emplacement des fichiers du projet et $ (TargetDir) pour référencer le répertoire de sortie.