Question

Je travaille dans Visual Studio 2005 et j'ai ajouté un fichier texte qui doit être analysé en cliquant avec le bouton droit de la souris sur le projet dans l'explorateur de solutions, puis ajoutez - > nouvel article. Cela place le fichier .txt dans le dossier du projet. Le fichier de débogage .exe se trouve dans le dossier / bin / debug.

Comment pointer correctement le fichier txt à partir du code à l'aide de chemins d'accès relatifs qui résoudront correctement le fait d'être deux dossiers en arrière, tout en résolvant de se trouver dans le même dossier après la publication de la solution?

Était-ce utile?

La solution

Découvrez la classe d'application . . Il a plusieurs membres qui peuvent être utilisés pour localiser des fichiers, etc. relatifs à l’application une fois qu’elle est installée.

Par exemple, Application.ExecutablePath vous indique où se trouve le fichier EXE en cours d’exécution; vous pouvez ensuite utiliser un chemin relatif pour trouver le fichier, par exemple. .. \ .. \ FileToBeParsed.txt. Cependant, cela suppose que les fichiers sont déployés dans la même structure de dossiers que la structure de dossiers du projet, ce qui n'est généralement pas le cas.

Prenez en compte des propriétés telles que CommonAppDataPath et LocalUserAppDataPath pour localiser les fichiers liés à l'application une fois le projet déployé.

Autres conseils

Si je comprends bien votre question: sélectionnez le fichier dans l '"Explorateur de solutions". Sous propriétés - > Copier dans le répertoire de sortie, sélectionnez " Copier toujours " ou "Copier si plus récent". Pour créer une action, sélectionnez "Contenu". Cela copiera le fichier dans le dossier / bin / debug lors de la construction. Vous devriez pouvoir le référencer à partir de la racine du projet à partir de là.

Une alternative à la localisation du fichier sur le disque serait d’inclure le fichier directement dans l’assemblage compilé en tant que ressource incorporée. Pour ce faire, cliquez avec le bouton droit sur le fichier et choisissez "Ressources incorporées". comme l'action de construction. Vous pouvez ensuite récupérer le fichier sous forme de flux d'octets:

Assembly thisAssembly = Assembly.GetExecutingAssembly();
Stream stream = thisAssembly.GetManifestResourceStream("Namespace.Folder.Filename.Ext");
byte[] data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);

Vous trouverez plus d'informations sur les ressources incorporées ici et ici .

Si vous construisez une application pour votre propre usage, la suggestion de David Krep est la meilleure: copiez simplement le fichier dans le répertoire de sortie. Si vous construisez un assemblage qui sera réutilisé ou distribué, l’option de ressource incorporée est préférable car elle regroupe tout dans un seul fichier .dll.

J'ajouterais une étape de post-génération qui copie le fichier txt dans le dossier de sortie de la configuration active:

xcopy "$(ProjectDir)*.txt" "$(OutDir)"

Quelques macros sont définies, telles que " $ (nom de configuration)" & <; code>, $ (rép_projet)

.

Allez à Propriétés du projet - > Propriétés de configuration - > Débogage

Définir " Répertoire de travail " vers $ (TargetDir)

Ensuite, vous pouvez correctement référencer votre fichier en utilisant un chemin relatif dans votre code (par exemple, ".... \ foo.xml")

.

La solution Application.ExecutablePath ne fonctionne pas pour les tests unittests. Le chemin de vstesthost.exe sera renvoyé

System.Reflection.Assembly.GetExecutingAssembly (). Location fonctionnera mais donnera le chemin d'accès avec le nom d'assembly inclus.

Donc ça marche:
System.Reflection.Assembly.GetExecutingAssembly (). Location + " \ .. \ " + " fileToRead.txt "

Mais juste:

fileToRead.txt

Fonctionne aussi. Semble que le répertoire de travail est le répertoire de l'assemblage en cours d'exécution par défaut.

Vous pouvez ajouter un événement post-génération pour copier le fichier .txt dans le dossier de sortie de la construction. Ensuite, votre code peut supposer que le fichier se trouve dans le même dossier que l'exécutable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top