Como navegar algumas pastas para cima?

115

Uma opção seria fazer System.IO.Directory.GetParent () algumas vezes. Existe uma maneira mais elegante de subir algumas pastas de onde reside o assembly em execução?

O que estou tentando fazer é encontrar um arquivo de texto que resida em uma pasta acima da pasta do aplicativo. Mas o conjunto em si está dentro do bin, que fica a algumas pastas na pasta do aplicativo.

desenvolvedor747
fonte
2
geralmente um caminho relativo funciona como '.. \ .. \ .. \ .. \ Downfolder', mas depende do que exatamente você está tentando fazer isso ...?
DiskJunky de
Esse sempre é o caso?
CR41G14 de
4
"Navegar" como? Você quer dizer o diretório atual? Se sim, você deve ser capaz de fazerDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Respostas:

211

Outra maneira simples é fazer isso:

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

Observação Isso sobe dois níveis. O resultado seria: newPath = @"C:\Folder1\Folder2\";

A-Sharabiani
fonte
18
Não faz sentido usar Path.Combinequando você está adicionando barra invertida manualmente de qualquer maneira. Considere usar em seu Path.Combine(path, "..", "..")lugar.
AXMIM
32

se c: \ pasta1 \ pasta2 \ pasta3 \ bin for o caminho, o código a seguir retornará o caminho da pasta base da pasta bin

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

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

ou seja, c: \ pasta1 \ pasta2 \ pasta3

se você quiser o caminho da pasta 2, poderá obter o diretório

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

então você obterá o caminho c: \ folder1 \ folder2 \

Siby Sunny
fonte
12

Você pode usar ..\pathpara subir um nível, ..\..\pathpara subir dois níveis do caminho.

Você também pode usar a Pathclasse.

Classe C # Path

DotNetUser
fonte
6

Isso é o que funcionou melhor para mim:

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

Obter o caminho 'certo' não era o problema, adicionar '../' obviamente faz isso, mas depois disso, a string fornecida não pode ser usada, porque vai apenas adicionar '../' no final. Circundá-lo com Path.GetFullPath()lhe dará o caminho absoluto, tornando-o utilizável.

Jacco
fonte
4

O método a seguir pesquisa um arquivo que começa com o caminho de inicialização do aplicativo (pasta * .exe). Se o arquivo não for encontrado lá, as pastas pai serão pesquisadas até que o arquivo seja encontrado ou a pasta raiz seja alcançada. nullé retornado se o arquivo não foi encontrado.

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

Nota: Application.StartupPathgeralmente é usado em aplicativos WinForms, mas também funciona em aplicativos de console; entretanto, você terá que definir uma referência para a System.Windows.Formsmontagem. Você pode substituir Application.StartupPathpor
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)se preferir.

Olivier Jacot-Descombes
fonte
4

Talvez você possa usar uma função se quiser declarar o número de níveis e colocá-lo em uma função?

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

E você poderia chamá-lo assim:

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

C #

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

isso pode ajudar

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

Tenho alguns diretórios virtuais e não consigo usar os métodos de diretório. Então, fiz uma função simples de dividir / juntar para os interessados. Embora não seja tão seguro.

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

Então, se você quiser mover 4 para cima, você só precisa alterar o 1para 4e adicionar algumas verificações para evitar exceções.

Sauleil
fonte
0

Se você souber a pasta para a qual deseja navegar, encontre o índice dela e depois a substring.

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

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
Taran
fonte
2
Isso falha em muitos casos. E se o nome da pasta for justo a, por exemplo? E se o caminho for assim C:\Folderame3\Folderame2\Folderame\...?
41686d6564
se o nome da pasta for apenas uma pesquisa "\\ a \\" ou \\ a se for a última
Taran