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.


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\";


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 \


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


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.


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.


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);

2

C #

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

1

cela peut aider

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

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.


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);

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.