String
A 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.PDF
como uma String?
Planejei dividir a string, mas essa não é a solução ideal.
String
A 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.PDF
como uma String?
Planejei dividir a string, mas essa não é a solução ideal.
Respostas:
basta usar File.getName ()
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
usando métodos String :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Uso alternativo Path
(Java 7+):
Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();
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ê.
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 seguida p.getFileName()
, retornará o caminho inteiro, não apenas The File Name.PDF
.
toString()
é tão estranho.
Usando FilenameUtils
no Apache Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Considerando o que String
você está perguntando é
C:\Hello\AnotherFolder\The File Name.PDF
precisamos extrair tudo após o último separador, ie. \
. É nisso que estamos interessados.
Você pode fazer
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Isso recuperará o índice do último \
no seu String
e extrairá tudo o que vier depois dele fileName
.
Se você tiver um String
separador diferente, ajuste lastIndexOf
para usar esse separador. (Existe até uma sobrecarga que aceita um inteiro String
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 valor lastIndexOf
retornado não é negativo porque o Javadoc declara que retornará
-1 se não houver tal ocorrência
você pode usar o caminho = C: \ Hello \ AnotherFolder \ TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
/
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
.
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:
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Considere o caso de que Java é multiplataforma:
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
Um método sem dependência e cuida de ... , . e separadores duplicados.
public static String getFileName(String filePath) {
if( filePath==null || filePath.length()==0 )
return "";
filePath = filePath.replaceAll("[/\\\\]+", "/");
int len = filePath.length(),
upCount = 0;
while( len>0 ) {
//remove trailing separator
if( filePath.charAt(len-1)=='/' ) {
len--;
if( len==0 )
return "";
}
int lastInd = filePath.lastIndexOf('/', len-1);
String fileName = filePath.substring(lastInd+1, len);
if( fileName.equals(".") ) {
len--;
}
else if( fileName.equals("..") ) {
len -= 2;
upCount++;
}
else {
if( upCount==0 )
return fileName;
upCount--;
len -= fileName.length();
}
}
return "";
}
Caso de teste:
@Test
public void testGetFileName() {
assertEquals("", getFileName("/"));
assertEquals("", getFileName("////"));
assertEquals("", getFileName("//C//.//../"));
assertEquals("", getFileName("C//.//../"));
assertEquals("C", getFileName("C"));
assertEquals("C", getFileName("/C"));
assertEquals("C", getFileName("/C/"));
assertEquals("C", getFileName("//C//"));
assertEquals("C", getFileName("/A/B/C/"));
assertEquals("C", getFileName("/A/B/C"));
assertEquals("C", getFileName("/C/./B/../"));
assertEquals("C", getFileName("//C//./B//..///"));
assertEquals("user", getFileName("/user/java/.."));
assertEquals("C:", getFileName("C:"));
assertEquals("C:", getFileName("/C:"));
assertEquals("java", getFileName("C:\\Program Files (x86)\\java\\bin\\.."));
assertEquals("C.ext", getFileName("/A/B/C.ext"));
assertEquals("C.ext", getFileName("C.ext"));
}
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.
extrair o nome do arquivo usando java regex *.
public String extractFileName(String fullPathFile){
try {
Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
Matcher regexMatcher = regex.matcher(fullPathFile);
if (regexMatcher.find()){
return regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
LOG.info("extractFileName::pattern problem <"+fullPathFile+">",ex);
}
return fullPathFile;
}
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/
Você pode usar o objeto FileInfo para obter todas as informações do seu arquivo.
FileInfo f = new FileInfo(@"C:\Hello\AnotherFolder\The File Name.PDF");
MessageBox.Show(f.Name);
MessageBox.Show(f.FullName);
MessageBox.Show(f.Extension );
MessageBox.Show(f.DirectoryName);