String
değişkeni bir dosya adı içeriyor C:\Hello\AnotherFolder\The File Name.PDF
. Dosya adını yalnızca The File Name.PDF
Dize olarak nasıl alabilirim ?
Dizeyi bölmeyi planladım, ancak bu en uygun çözüm değil.
String
değişkeni bir dosya adı içeriyor C:\Hello\AnotherFolder\The File Name.PDF
. Dosya adını yalnızca The File Name.PDF
Dize olarak nasıl alabilirim ?
Dizeyi bölmeyi planladım, ancak bu en uygun çözüm değil.
Yanıtlar:
sadece File.getName () kullanın
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
String yöntemlerini kullanarak :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Alternatif kullanım Path
(Java 7+):
Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();
Dizeyi bölmenin \\
dosya ayırıcı değişebileceğinden platforma bağlı olduğunu unutmayın . Path#getName
bu konuyu sizin için halleder.
Paths.get
Dosya sistemine eriştiğini sanmıyorum, bu yüzden performansın bir subring / indexOf'dan önemli ölçüde farklı olmasını beklemiyordum.
Internet Explorer
ve yolu var "C:\\Hello\\AnotherFolder\\The File Name.PDF"
ama kodunuz bir Unix / Linux makinesinde çalışıyor, p.getFileName()
sadece tüm yolu değil The File Name.PDF
.
toString()
çok garip.
Kullanılması FilenameUtils
halinde Apache Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Düşünüldüğünde String
sizsiniz soruyorsun
C:\Hello\AnotherFolder\The File Name.PDF
son ayırıcıdan sonra her şeyi çıkarmamız gerekiyor, yani. \
. İlgilendiğimiz şey bu.
Yapabilirsin
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Bu son dizinini alır \
senin içinde String
içine ondan sonra gelir ve ekstresinin her şey fileName
.
Eğer bir varsa String
farklı bir ayırıcı ile, ayarlamak lastIndexOf
o ayırıcı kullanmak. ( Bir bütünü ayırıcı olarak kabul eden bir aşırı yük bile vardır String
.)
Yukarıdaki örnekte atladım, ancak nereden String
geldiğinden veya ne içerebileceğinden emin değilseniz lastIndexOf
, Javadoc'un geri döneceğini belirttiğinden , negatif olmayan bir değer döndürdüğünü doğrulamak istersiniz.
-1 böyle bir olay yoksa
path = C: \ Hello \ AnotherFolder \ TheFileName.PDF kullanabilirsiniz
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
/
unix ve \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like
Dosya` ya da Paths
.
File.separator
platformu bağımlı da? Yoksa bu işe String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
File.separator
Windows'ta bir dosya adı ya ile ayrılabilir çünkü hep burada çalışmaz "/"
ya "\\"
.
Diğer yanıtlar, mevcut senaryomdan farklı bir işletim sisteminden kaynaklanan yolları okuduğum özel senaryom için pek işe yaramadı. Ayrıntılı olarak bir Windows sunucusundan kaydedilmiş e-posta eklerini bir Linux sunucusunda kaydediyorum. JavaMail API'sinden döndürülen dosya adı 'C: \ temp \ hello.xls' gibidir.
Sonunda bulduğum çözüm:
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Java'nın Çoklu Platform olduğunu düşünün:
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
Herhangi bir bağımlılığı olmayan ve ilgilenen bir yöntem .. , . ve yinelenen ayırıcılar.
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 "";
}
Test durumu:
@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"));
}
Belki getFileName biraz kafa karıştırıcıdır, çünkü dizin adlarını da döndürür. Bir yoldaki dosyanın veya son dizinin adını döndürür.
java regex * kullanarak dosya adını ayıklayın.
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;
}
java.nio.file.Path dosyasının getFileName () yöntemi, bu yol nesnesinin işaret ettiği dosya veya dizinin adını döndürmek için kullanılır.
Yol getFileName ()
Referans için:
https://www.geeksforgeeks.org/path-getfilename-method-in-java-with-examples/
Dosyanızın tüm bilgilerini almak için FileInfo nesnesini kullanabilirsiniz.
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);