Estou processando um TreeView
de diretórios e arquivos. Um usuário pode selecionar um arquivo ou um diretório e, em seguida, fazer algo com ele. Isso exige que eu tenha um método que execute ações diferentes com base na seleção do usuário.
No momento, estou fazendo algo assim para determinar se o caminho é um arquivo ou um diretório:
bool bIsFile = false;
bool bIsDirectory = false;
try
{
string[] subfolders = Directory.GetDirectories(strFilePath);
bIsDirectory = true;
bIsFile = false;
}
catch(System.IO.IOException)
{
bIsFolder = false;
bIsFile = true;
}
Não posso deixar de sentir que há uma maneira melhor de fazer isso! Eu esperava encontrar um método .NET padrão para lidar com isso, mas não consegui fazer isso. Existe esse método e, se não, qual é o meio mais direto para determinar se um caminho é um arquivo ou diretório?
Respostas:
Em Como saber se o caminho é arquivo ou diretório :
Atualização para .NET 4.0+
Pelos comentários abaixo, se você estiver no .NET 4.0 ou posterior (e o desempenho máximo não for crítico), poderá escrever o código de maneira mais limpa:
fonte
&
operador retornarão um valor binário em que apenas os bits que estão ligados (1) nos dois operandos estão ativados. Nesse caso, fazendo uma operação bit a bit e contraattr
e oFileAttributes.Directory
valor retornará o valorFileAttributes.Directory
se o bit de atributo do arquivo de diretório estiver ativado. Veja en.wikipedia.org/wiki/Bitwise_operation para uma explicação melhor.C:\Temp
refere a um diretório chamadoTemp
ou a um arquivo chamadoTemp
. O que o código deve fazer?attr.HasFlag(FileAttributes.Directory)
pode ser usado.Que tal usá-los?
fonte
File.GetAttributes()
.public static bool? IsDirectory(string path){
if (Directory.Exists(path))
return true; // is a directory
else if (File.Exists(path))
return false; // is a file
else
return null; // is a nothing
}
Com apenas essa linha, você pode obter se um caminho é um diretório ou arquivo:
fonte
Aqui está o meu:
É semelhante às respostas dos outros, mas não exatamente o mesmo.
fonte
Path.DirectorySeparatorChar
ePath.AltDirectorySeparatorChar
Como alternativa ao Directory.Exists (), você pode usar o método File.GetAttributes () para obter os atributos de um arquivo ou diretório, para poder criar um método auxiliar como este:
Você também pode considerar adicionar um objeto à propriedade tag do controle TreeView ao preencher o controle que contém metadados adicionais para o item. Por exemplo, você pode adicionar um objeto FileInfo para arquivos e um objeto DirectoryInfo para diretórios e, em seguida, testar o tipo de item na propriedade tag para economizar fazendo chamadas adicionais ao sistema para obter esses dados ao clicar no item.
fonte
isDirectory = (fa & FileAttributes.Directory) != 0);
Este foi o melhor que pude apresentar, devido ao comportamento das propriedades Exists and Attributes:
Aqui está como ele é testado:
fonte
Depois de combinar as sugestões das outras respostas, percebi que tinha a mesma coisa que a resposta de Ronnie Overby . Aqui estão alguns testes para apontar algumas coisas em que pensar:
C:\Temp\folder_with.dot
Path.DirectorySeparatorChar
ePath.AltDirectorySeparatorChar
)Testes (Linqpad)
Resultados
Método
fonte
Path.DirectorySeparatorChar.ToString()
em vez de concat string com""
?new String(Path.DirectorySeparatorChar, 1)
o queToString
faz, se quiser realmente ser otimizado.A abordagem mais precisa será usar algum código de interoperabilidade do shlwapi.dll
Você poderia chamar assim:
fonte
Aqui está o que usamos:
fonte
Me deparei com isso ao enfrentar um problema semelhante, exceto que eu precisava verificar se o caminho é para um arquivo ou pasta, quando esse arquivo ou pasta pode realmente não existir . Houve alguns comentários nas respostas acima que mencionaram que não funcionariam nesse cenário. Encontrei uma solução (eu uso o VB.NET, mas você pode converter, se necessário) que parece funcionar bem para mim:
Espero que isso possa ser útil para alguém!
fonte
test.txt
e um arquivo pode ser chamadotest
-, nestes casos, o código seria retornar resultados incorretosmuuuuito tarde no jogo eu sei, mas pensei em compartilhar isso de qualquer maneira. Se você estiver trabalhando apenas com os caminhos como seqüências de caracteres, descobrir isso é fácil como torta:
por exemplo:
ThePath == "C:\SomeFolder\File1.txt"
acabaria sendo assim:Outro exemplo:
ThePath == "C:\SomeFolder\"
acabaria sendo este:E isso também funcionaria sem a barra invertida:
ThePath == "C:\SomeFolder"
acabaria sendo assim:Lembre-se de que isso só funciona com os caminhos em si, e não com o relacionamento entre o caminho e o "disco físico" ... portanto, não é possível dizer se o caminho / arquivo existe ou algo parecido, mas com certeza pode dizer se o caminho é uma pasta ou um arquivo ...
fonte
System.IO.FileSystemWatcher
desde que, quando um diretório é excluído, ele é enviadoc:\my_directory
como um argumento que é o mesmo quando um arquivo com menos extensãoc:\my_directory
é excluído.GetDirectoryName('C:\SomeFolder')
retorna'C:\'
, para que seu último caso não funcione. Isso não faz distinção entre diretórios e arquivos sem extensões.Path.GetDirectoryName("C:\SomeFolder\SomeSubFolder")
retornaráC:\SomeFolder
. Observe que seus próprios exemplos do que GetDirectoryName retorna mostram que ele retorna um caminho que não termina em uma barra invertida. Isso significa que, se alguém usar GetDirectoryName em outro local para obter um caminho de diretório e, em seguida, alimentá-lo com o seu método, eles obterão a resposta errada.Se você deseja encontrar diretórios, incluindo aqueles marcados como "ocultos" e "sistema", tente o seguinte (requer o .NET V4):
fonte
Eu precisava disso, as postagens ajudaram, isso reduz a uma linha e, se o caminho não é um caminho, ele apenas retorna e sai do método. Ele aborda todas as preocupações acima, também não precisa da barra final.
fonte
Eu uso o seguinte, ele também testa a extensão, o que significa que pode ser usado para testar se o caminho fornecido é um arquivo, mas não existe.
fonte
fonte
Usando a resposta selecionada neste post, analisei os comentários e dou crédito a @ ŞafakGür, @Anthony e @Quinn Wilson por seus bits de informações que me levaram a essa resposta aprimorada que escrevi e testei:
fonte
Talvez para UWP C #
fonte
Entendo, estou 10 anos atrasado para a festa. Eu estava enfrentando a situação, onde de alguma propriedade posso receber um nome de arquivo ou um caminho completo. Se não houver um caminho fornecido, eu tenho que verificar a existência do arquivo anexando um caminho de diretório "global" fornecido por outra propriedade.
No meu caso
fez o truque. Ok, não é mágico, mas talvez isso possa poupar alguém alguns minutos de descobrir. Como isso é apenas uma análise de string, nomes de diretórios com pontos podem fornecer falsos positivos ...
fonte
Muito tarde para a festa aqui, mas eu achei o
Nullable<Boolean>
valor de retorno bastante feio -IsDirectory(string path)
retornarnull
não equivale a um caminho inexistente sem comentários detalhados, então eu vim com o seguinte:Esse método auxiliar foi escrito para ser detalhado e conciso o suficiente para entender a intenção na primeira vez em que você o lê.
fonte
Isso não funcionaria?
fonte