Comment naviguer dans quelques dossiers vers le haut?

115

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'endroit où se trouve l'assembly en cours d'exécution?

Ce que j'essaie de faire, c'est de trouver un fichier texte qui réside dans un dossier au-dessus du dossier d'application. Mais l'assemblage lui-même est à l'intérieur du bac, qui se trouve à quelques dossiers au fond du dossier de l'application.

développeur747
la source
2
généralement un chemin relatif fait l'affaire comme «.. \ .. \ .. \ .. \ Downfolder» mais cela dépend de ce que vous essayez exactement de faire cela pour ...?
DiskJunky
est-ce toujours le cas?
CR41G14
4
"Naviguer" comment? Voulez-vous dire le répertoire actuel? Si oui, vous devriez pouvoir le faireDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Réponses:

211

Une autre manière simple est de faire ceci:

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

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

A-Sharabiani
la source
18
Il ne sert à rien d'utiliser Path.Combinelorsque vous ajoutez de toute façon une barre oblique inverse manuellement. Pensez à utiliser à la Path.Combine(path, "..", "..")place.
AXMIM
32

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

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

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

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

si vous voulez le chemin du dossier2, vous pouvez obtenir le répertoire par

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

alors vous obtiendrez le chemin comme c: \ dossier1 \ dossier2 \

Siby Sunny
la source
12

Vous pouvez utiliser ..\pathpour monter d'un niveau, ..\..\pathpour monter de deux niveaux à partir du chemin.

Vous pouvez également utiliser la Pathclasse.

Classe C # Path

DotNetUser
la source
6

C'est ce qui a le mieux fonctionné pour moi:

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));

Obtenir le "bon" chemin n'était pas le problème, ajouter "../" le fait évidemment, mais après cela, la chaîne donnée n'est plus utilisable, car elle ajoutera simplement le "../" à la fin. L'entourer Path.GetFullPath()vous donnera le chemin absolu, le rendant utilisable.

Jacco
la source
4

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. nullest 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.StartupPathest généralement utilisé dans les applications WinForms, mais il fonctionne également dans les applications console; cependant, vous devrez définir une référence à l' System.Windows.Formsassemblage. Vous pouvez remplacer Application.StartupPathpar
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)si vous préférez.

Olivier Jacot-Descombes
la source
4

Peut-être pourriez-vous utiliser une fonction si vous souhaitez 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 ceci:

String path = this.GetParents(4, currentpath);
CR41G14
la source
2

C #

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));
Moberme
la source
1

cela peut aider

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

J'ai des répertoires virtuels et je ne peux pas utiliser les méthodes de répertoire. J'ai donc créé une simple fonction de fractionnement / 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 déplacer 4 vers le haut, il vous suffit de changer le 1en 4et d'ajouter quelques vérifications pour éviter les exceptions.

Sauleil
la source
0

Si vous connaissez le dossier dans lequel vous souhaitez naviguer, recherchez-en l'index puis sous-chaîne.

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

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
Taran
la source
2
Cela échoue dans de nombreux cas. Et si le nom du dossier est juste a, par exemple? Et si le chemin ressemble à ceci C:\Folderame3\Folderame2\Folderame\...?
41686d6564
si le nom du dossier est juste une recherche "\\ a \\" ou \\ a si c'est le dernier
Taran