web-dev-qa-db-fra.com

Obtention du chemin d'accès au dossier parent du fichier de solution à l'aide de C #

Je suis un débutant en C #, et j'ai un dossier dans lequel je lis un fichier.

Je souhaite lire un fichier situé dans le dossier parent du fichier de solution. Comment puis-je faire cela?

string path = "";
StreamReader sr = new StreamReader(path);

Donc, si mon fichier XXX.sln est dans C:\X0\A\XXX\ puis lisez le .txt fichiers dans C:\X0\A\.

12
User1204501

Essaye ça:

string startupPath = Path.Combine(Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName,"abc.txt");

// Read the file as one string. 
string text = System.IO.File.ReadAllText(startupPath);
19
Thilina H

Vous pouvez profiter de cette solution plus générale qui dépend de la recherche de la solution *.sln fichier en analysant tous les répertoires parents à partir du répertoire actuel ou sélectionné tout en couvrant le cas de ne pas trouver le répertoire de la solution!

public static class VisualStudioProvider
{
    public static DirectoryInfo TryGetSolutionDirectoryInfo(string currentPath = null)
    {
        var directory = new DirectoryInfo(
            currentPath ?? Directory.GetCurrentDirectory());
        while (directory != null && !directory.GetFiles("*.sln").Any())
        {
            directory = directory.Parent;
        }
        return directory;
    }
}

Usage:

// get directory
var directory = VisualStudioProvider.TryGetSolutionDirectoryInfo();
// if directory found
if (directory != null)
{
    Console.WriteLine(directory.FullName);
}

Dans ton cas:

// resolve file path
var filePath = Path.Combine(
    VisualStudioProvider.TryGetSolutionDirectoryInfo()
    .Parent.FullName, 
    "filename.ext");
// usage file
StreamReader reader = new StreamReader(filePath);

Prendre plaisir!

Maintenant, un avertissement .. Votre application doit être indépendante de la solution - à moins qu'il ne s'agisse d'un projet personnel pour un outil de traitement de solution, cela ne me dérangerait pas. Comprenez que votre application une fois distribuée aux utilisateurs sera réside dans un dossier sans la solution. Maintenant, vous pouvez utiliser un fichier "d'ancrage". Par exemple. rechercher les dossiers parents comme je l'ai fait et vérifier l'existence d'un fichier vide app.anchor ou mySuperSpecificFileNameToRead.ext; P Si vous voulez que j'écrive la méthode que je peux - faites le moi savoir.

Maintenant, vous pouvez vraiment en profiter! :RÉ

12
Demetris Leptos

Je pense que ce serait négligent si votre application s’appuyait sur l’emplacement d’un fichier en fonction de la relation entre le chemin du fichier et le chemin de la solution. Alors que votre programme peut très bien s'exécuter sur Solution/Project/Bin/$(ConfigurationName)/$(TargetFileName), cela ne fonctionne que lorsque vous exécutez à l'intérieur des limites de Visual Studio. En dehors de Visual Studio, dans d'autres scénarios, ce n'est pas nécessairement le cas.

Je vois deux options:

  1. Incluez le fichier dans votre projet et, dans ses propriétés, faites-le copier dans le dossier de sortie. Vous pouvez alors accéder au fichier ainsi:

    string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Yourfile.txt");
    

    Remarque: pendant le déploiement, vous devrez vous assurer que ce fichier est également déployé avec votre exécutable.

  2. Utilisez des arguments de ligne de commande pour spécifier le chemin absolu du fichier au démarrage. Cela peut être défini par défaut dans Visual Studio (voir Propriétés du projet -> onglet Débogage -> Arguments de ligne de commande ". Par exemple:

    filePath="C:\myDevFolder\myFile.txt"
    

    Il existe un certain nombre de méthodes et de bibliothèques concernant l'analyse de la ligne de commande. Voici une réponse Stack Overflow sur l'analyse des arguments de la ligne de commande.

6
Moo-Juice

Je pense que c'est ce que tu veux. Je ne sais pas si c'est une bonne idée lors de la publication:

string dir = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName;

A besoin using System.IO;

2
stevepkr84
string path = Application.StartupPath;
1
Anand