Eu uso este código para encontrar o diretório de depuração
public string str_directory = Environment.CurrentDirectory.ToString();
"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug"
Como posso encontrar a pasta pai conforme mostrado abaixo?
"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj"
c#
directory
filesystems
Masoud Abasian
fonte
fonte
Respostas:
Você pode usar
System.IO.Directory.GetParent()
para recuperar o diretório pai de um determinado diretório.fonte
DirectoryInfo.Parent
. por exemplonew System.IO.DirectoryInfo("c:/path/to/somewhere//").Parent
. @northbenstring parent = System.IO.Directory.GetParent(str_directory).FullName;
Veja BOL
fonte
Se você anexar
..\..
ao seu caminho existente, o sistema operacional navegará corretamente na pasta dos avós.Isso deve fazer o trabalho:
System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");
Se você navegar por esse caminho, você navegará no diretório dos avós.
fonte
Descobri que as variantes de
System.IO.Path.Combine(myPath, "..")
são as mais fáceis e confiáveis. Ainda mais se o que northben diz for verdade, que GetParent requer uma chamada extra se houver uma barra final. Isso, para mim, não é confiável.Path.Combine garante que você nunca errará com barras.
..
se comporta exatamente como em qualquer outro lugar do Windows. Você pode adicionar qualquer número de\..
a um caminho no cmd ou explorer e ele se comportará exatamente como eu descrevo abaixo.Alguns
..
comportamentos básicos :..
será cortado:Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..")
=>D:\Grandparent\Parent\
..
subirá um nível:Path.Combine(@"D:\Grandparent\Parent\", "..")
=>D:\Grandparent\
..\..
segue as mesmas regras, duas vezes seguidas:Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..")
=>D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", @"..\..")
=>D:\
Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..")
=>D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", "..", "..")
=>D:\
fonte
Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")
=D:\Grandparent\Parent\Child.txt\..
Path.Combine
não trunca a própria string. O caminho , uma vez usado para acessar o sistema de arquivos, tem o efeito desejado. No entanto, concordo que isso é abaixo do ideal. Veja minha resposta mais recente nesta página para uma abordagem que modifica a string em vez de precisar do sistema de arquivos para resolver o caminho.Para obter um diretório 'avós', chame Directory.GetParent () duas vezes:
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
fonte
var gparent = Directory.GetParent(str_directory).Parent; // Cleaner?
Directory.GetParent
é provavelmente uma resposta melhor, mas para ser completo há um método diferente que leva string e retorna string:Path.GetDirectoryName
.string parent = System.IO.Path.GetDirectoryName(str_directory);
fonte
Como isso:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory); string parentDirectory = myDirectory.Parent.FullName;
Boa sorte!
fonte
Você pode querer olhar para o
DirectoryInfo
.Parent
propriedade.fonte
Para evitar problemas com trailing \, chame-o desta forma:
string ParentFolder = Directory.GetParent( folder.Trim('\\')).FullName;
fonte
TrimEnd
se quiser apenas remover o trailing`'s . I'm not sure if a leading
`é significativo em outros sistemas operacionais.Para obter sua solução, tente isso
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
fonte
Esta é a forma mais comum - realmente depende do que você está fazendo exatamente: (para explicar, o exemplo abaixo removerá os últimos 10 caracteres que você pediu, no entanto, se houver algumas regras de negócios que direcionam sua necessidade para encontrar um local específico, você deve usá-los para recuperar o local do diretório, não encontrar o local de outra coisa e modificá-la.)
// remove last 10 characters from a string str_directory = str_directory.Substring(0,str_directory.Length-10);
fonte
\bin\Debug
, sem nenhum` and no other path, so it's extraordinarily fragile. Your second doesn't work because
Environment.CurrentDirectory` à direita é uma string e as strings não têm umaParent
propriedade.Ninguém forneceu uma solução que funcionasse de forma cruzada. Eu sei que não foi perguntado especificamente, mas estou trabalhando em um ambiente linux onde a maioria das soluções (como no momento em que publiquei isso) forneceria um erro.
Separadores de caminho de codificação (bem como outras coisas) darão um erro em qualquer coisa, exceto nos sistemas Windows.
Na minha solução original, usei:
char filesep = Path.DirectorySeparatorChar; string datapath = $"..{filesep}..{filesep}";
No entanto, depois de ver algumas das respostas aqui, ajustei para ser:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
fonte
Uma vez que nada mais que eu encontrei ajuda a resolver isso de uma forma verdadeiramente normalizada, aqui está outra resposta.
Observe que algumas respostas a perguntas semelhantes tentam usar o
Uri
tipo, mas isso também luta com barras finais e sem barras finais.Minha outra resposta nesta página funciona para operações que colocam o sistema de arquivos para funcionar, mas se quisermos ter o caminho resolvido agora (como para fins de comparação), sem passar pelo sistema de arquivos,
C:/Temp/..
eC:/
seria considerado diferente. Sem passar pelo sistema de arquivos, navegar dessa maneira não nos fornece um caminho normalizado e adequadamente comparável.O que podemos fazer?
Vamos desenvolver a seguinte descoberta:
string
, não comochar
) tratará umnull
caminho da mesma forma que trata""
.GetDirectoryName
irá abster-se de descartar o último componente do caminho graças à barra adicionada.GetDirectoryName
irá normalizar barras e pontos de navegação...
recolher navegando para cima.GetDirectoryName
vai voltarnull
para um caminho vazio, ao qual nos unimos""
.Como usamos isso?
Primeiro, normalize o caminho de entrada :
dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";
Em seguida, podemos obter o diretório pai e podemos repetir essa operação quantas vezes quiser para navegar mais para cima:
// This is reliable if path results from this or the previous operation path = Path.GetDirectoryName(path);
Observe que nunca mexemos no sistema de arquivos. Nenhuma parte do caminho precisa existir, como existiria se o tivéssemos usado
DirectoryInfo
.fonte
Você não deve tentar fazer isso. Environment.CurrentDirectory fornece o caminho do diretório executável. Isso é consistente, independentemente de onde o arquivo .exe esteja. Você não deve tentar acessar um arquivo que se presume estar em uma localização relativa ao contrário
Eu sugiro que você mova qualquer recurso que deseja acessar para um local local. De um diretório do sistema (como AppData)
fonte
IO.Path.GetFullPath(@"..\..")
Se você limpar o "
bin\Debug\
" nas propriedades do projeto -> Build -> Caminho de saída, você pode apenas usarAppDomain.CurrentDomain.BaseDirectory
fonte