web-dev-qa-db-fra.com

Comment naviguer dans quelques dossiers?

Une option serait de faire System.IO.Directory.GetParent () plusieurs fois. Existe-t-il un moyen plus élégant de parcourir quelques dossiers à partir de l’Assemblée exécutante?

Ce que j'essaie de faire est de trouver un fichier texte qui réside dans un dossier au-dessus du dossier de l'application. Mais l’Assemblée elle-même se trouve à l’intérieur de la corbeille, qui contient quelques dossiers situés dans le dossier de l’application.

80
developer747

Une autre façon simple est de faire ceci:

string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));

Remarque Ceci monte de deux niveaux. Le résultat serait: newPath = @"C:\Folder1\Folder2\";

157
A-Sharabiani

si c:\folder1\folder2\folder3\bin est le chemin, le code suivant renvoie le dossier de base du dossier bin

string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString());

c'est-à-dire, c:\dossier1\dossier2\dossier3

si vous voulez le chemin folder2, alors vous pouvez obtenir le répertoire en 

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();

alors vous obtiendrez chemin comme c:\folder1\folder2 \

16
Siby Sunny

Vous pouvez utiliser ..\path pour monter d'un niveau, ..\..\path pour passer d'un niveau à l'autre.

Vous pouvez également utiliser la classe Path.

Classe de chemin C #

4
DotNetUser

La méthode suivante recherche un fichier commençant par le chemin de démarrage de l'application (dossier * .exe). Si le fichier n'y est pas trouvé, les dossiers parents sont recherchés jusqu'à ce que le fichier soit trouvé ou que le dossier racine soit atteint. null est renvoyé si le fichier n'a pas été trouvé.

public static FileInfo FindApplicationFile(string fileName)
{
    string startPath = Path.Combine(Application.StartupPath, fileName);
    FileInfo file = new FileInfo(startPath);
    while (!file.Exists) {
        if (file.Directory.Parent == null) {
            return null;
        }
        DirectoryInfo parentDir = file.Directory.Parent;
        file = new FileInfo(Path.Combine(parentDir.FullName, file.Name));
    }
    return file;
}

Remarque: Application.StartupPath est généralement utilisé dans les applications WinForms, mais il fonctionne également dans les applications de console. Cependant, vous devrez définir une référence à l'assembly System.Windows.Forms. Vous pouvez remplacer Application.StartupPath par
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) si vous préférez.

3

cela peut aider

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}
1
Thomas

Peut-être que vous pourriez utiliser une fonction si vous voulez déclarer le nombre de niveaux et le mettre dans une fonction?

private String GetParents(Int32 noOfLevels, String currentpath)
{
     String path = "";
     for(int i=0; i< noOfLevels; i++)
     {
         path += @"..\";
     }
     path += currentpath;
     return path;
}

Et vous pourriez l'appeler comme ça:

String path = this.GetParents(4, currentpath);
0
CR41G14

Si vous connaissez le dossier vers lequel vous souhaitez naviguer, recherchez son index puis sous-chaîne.

            var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
0
Taran

J'ai des répertoires virtuels et je ne peux pas utiliser les méthodes de répertoire. J'ai donc créé une fonction simple de scission/jointure pour les personnes intéressées. Pas aussi sûr cependant.

var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());

Donc, si vous voulez passer à 4, il vous suffit de changer le 1 en 4 et d'ajouter des vérifications pour éviter les exceptions.

0
Sauleil