Como obtenho o nome do arquivo de uma String contendo o caminho do arquivo Absoluto?
236
StringA variável contém um nome de arquivo C:\Hello\AnotherFolder\The File Name.PDF. Como obtenho apenas o nome do arquivo The File Name.PDFcomo uma String?
Planejei dividir a string, mas essa não é a solução ideal.
File f =newFile("C:\\Hello\\AnotherFolder\\The File Name.PDF");System.out.println(f.getName());
usando métodos String :
File f =newFile("C:\\Hello\\AnotherFolder\\The File Name.PDF");System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Alguém fez uma comparação de desempenho nos vários métodos desta pergunta?
esmagar
@crush Eu não acho que Paths.getacesse o sistema de arquivos, então não esperaria que o desempenho fosse materialmente diferente de um substring / indexOf.
assylias 26/09/13
7
Por que ele não existe no Android? esquisito.
desenvolvedor android
12
Sim, o Path lida com o problema dependente da plataforma de barra / barra invertida, mas apenas se o caminho do arquivo for da mesma máquina (ou plataforma). Considere o seguinte: você faz o upload do arquivo Internet Explorere ele possui o caminho, "C:\\Hello\\AnotherFolder\\The File Name.PDF"mas seu código está funcionando em uma máquina Unix / Linux e, em seguida p.getFileName(), retornará o caminho inteiro, não apenas The File Name.PDF.
Isso recuperará o índice do último \no seu Stringe extrairá tudo o que vier depois dele fileName.
Se você tiver um Stringseparador diferente, ajuste lastIndexOfpara usar esse separador. (Existe até uma sobrecarga que aceita um inteiro Stringcomo separador.)
Omiti-o no exemplo acima, mas se você não souber de onde Stringvem ou o que pode conter, você deve validar que o valor lastIndexOfretornado não é negativo porque o Javadoc declara que retornará
Você não deve usar nenhum deles, pois depende da plataforma. /no unix e \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` ou Paths.
Automatico
3
File.separatorTambém é dependente da plataforma? Ou será que esse trabalho ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
Jonathan
File.separator e File.separatorChar são "/" na versão UNIX / Linux / macOS do JDK e "\" na versão Windows.
賈可Jacky
2
File.separatornem sempre funcionará aqui porque no Windows um nome de arquivo pode ser separado por um "/"ou outro "\\".
DodgyCodeException 23/11
10
As outras respostas não funcionaram no meu cenário específico, onde estou lendo caminhos que se originaram de um SO diferente do atual. Para elaborar, estou salvando anexos de email salvos de uma plataforma Windows em um servidor Linux. O nome do arquivo retornado da API JavaMail é algo como 'C: \ temp \ hello.xls'
Você pode usar o objeto FileInfo para obter todas as informações do seu arquivo.
FileInfo f =newFileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");MessageBox.Show(f.Name);MessageBox.Show(f.FullName);MessageBox.Show(f.Extension);MessageBox.Show(f.DirectoryName);
Respostas:
basta usar File.getName ()
usando métodos String :
fonte
Uso alternativo
Path
(Java 7+):Observe que a divisão da sequência
\\
depende da plataforma, pois o separador de arquivos pode variar.Path#getName
cuida desse problema para você.fonte
Paths.get
acesse o sistema de arquivos, então não esperaria que o desempenho fosse materialmente diferente de um substring / indexOf.Internet Explorer
e ele possui o caminho,"C:\\Hello\\AnotherFolder\\The File Name.PDF"
mas seu código está funcionando em uma máquina Unix / Linux e, em seguidap.getFileName()
, retornará o caminho inteiro, não apenasThe File Name.PDF
.toString()
é tão estranho.Usando
FilenameUtils
no Apache Commons IO :fonte
Considerando o que
String
você está perguntando éprecisamos extrair tudo após o último separador, ie.
\
. É nisso que estamos interessados.Você pode fazer
Isso recuperará o índice do último
\
no seuString
e extrairá tudo o que vier depois delefileName
.Se você tiver um
String
separador diferente, ajustelastIndexOf
para usar esse separador. (Existe até uma sobrecarga que aceita um inteiroString
como separador.)Omiti-o no exemplo acima, mas se você não souber de onde
String
vem ou o que pode conter, você deve validar que o valorlastIndexOf
retornado não é negativo porque o Javadoc declara que retornaráfonte
Desde 1,7
fonte
você pode usar o caminho = C: \ Hello \ AnotherFolder \ TheFileName.PDF
fonte
/
no unix e\`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like
File` ouPaths
.File.separator
Também é dependente da plataforma? Ou será que esse trabalho ...String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
File.separator
nem sempre funcionará aqui porque no Windows um nome de arquivo pode ser separado por um"/"
ou outro"\\"
.As outras respostas não funcionaram no meu cenário específico, onde estou lendo caminhos que se originaram de um SO diferente do atual. Para elaborar, estou salvando anexos de email salvos de uma plataforma Windows em um servidor Linux. O nome do arquivo retornado da API JavaMail é algo como 'C: \ temp \ hello.xls'
A solução que eu acabei com:
fonte
Considere o caso de que Java é multiplataforma:
fonte
Um método sem dependência e cuida de ... , . e separadores duplicados.
Caso de teste:
Talvez getFileName seja um pouco confuso, porque também retorna nomes de diretório. Retorna o nome do arquivo ou último diretório em um caminho.
fonte
extrair o nome do arquivo usando java regex *.
fonte
O método getFileName () de java.nio.file.Path usado para retornar o nome do arquivo ou diretório apontado por este objeto de caminho.
Caminho getFileName ()
Para referência:
https://www.geeksforgeeks.org/path-getfilename-method-in-java-with-examples/
fonte
Você pode usar o objeto FileInfo para obter todas as informações do seu arquivo.
fonte