मुझे फ़ाइल का नाम स्ट्रिंग से पूर्ण फ़ाइल पथ से कैसे मिलता है?


236

Stringचर एक फ़ाइल नाम, C:\Hello\AnotherFolder\The File Name.PDF। मैं केवल The File Name.PDFएक स्ट्रिंग के रूप में फ़ाइल नाम कैसे प्राप्त करूं?

मैंने स्ट्रिंग को विभाजित करने की योजना बनाई है, लेकिन यह इष्टतम समाधान नहीं है।


जारीकर्ता के संदर्भ के साथ। urissues / 37131215 , यह तय हो गया है।
प्रग्स

जवाबों:


280

बस File.getName का उपयोग करें ()

File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());

स्ट्रिंग विधियों का उपयोग करना :

  File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");  
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));

सहायक। धन्यवाद।
पूजा


278

वैकल्पिक उपयोग Path (जावा 7+):

Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();

ध्यान दें कि स्ट्रिंग को विभाजित करना \\प्लेटफ़ॉर्म पर निर्भर है क्योंकि फ़ाइल विभाजक भिन्न हो सकता है। Path#getNameआपके लिए उस मुद्दे का ध्यान रखता है।


1
क्या किसी ने इस प्रश्न में विभिन्न तरीकों पर प्रदर्शन की तुलना की है?
क्रश करें

@ मुझे लगता है कि Paths.getफ़ाइल सिस्टम तक पहुँच नहीं है, इसलिए प्रदर्शन के विकल्प / अनुक्रमणिका से भौतिक रूप से भिन्न होने की उम्मीद नहीं की जाएगी।
अस्वच्छ

7
यह कैसे आता है Android पर मौजूद नहीं है? अजीब।
एंड्रॉइड डेवलपर

12
हाँ, पथ स्लैश / बैकस्लैश की प्लेटफ़ॉर्म आश्रित समस्या से जूझता है, लेकिन केवल अगर फ़ाइल पथ एक ही मशीन (या प्लेटफ़ॉर्म) से है। इस पर विचार करें: आप फ़ाइल से अपलोड करते हैं Internet Explorerऔर उसके पास पथ है "C:\\Hello\\AnotherFolder\\The File Name.PDF"लेकिन आपका कोड एक यूनिक्स / लिनक्स मशीन पर काम कर रहा है, फिर p.getFileName()केवल नहीं, बल्कि पूरे मार्ग को लौटा देगा The File Name.PDF
nyxz

3
पुकारना toString()कितना अजीब है।
पेट्रोक्लिफ

53

Apache Commons IOFilenameUtils में उपयोग करना :

String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");

5
मुझे लगता है कि यह सबसे अच्छा हो सकता है, क्योंकि कभी-कभी आपको फ़ाइल प्लेटफ़ॉर्म को अन्य प्लेटफ़ॉर्म से संसाधित करना पड़ सकता है
ruiruige1991

यह सबसे अच्छा है क्योंकि: पढ़ने के लिए आसान, सबसे मजबूत, कम ऑब्जेक्ट कोड में +1
fl0w

32

ध्यान में रखते हुए Stringआप पूछ रहे हैं

C:\Hello\AnotherFolder\The File Name.PDF

हमें अंतिम विभाजक के बाद सब कुछ निकालने की आवश्यकता है, अर्थात। \। यही हमारी रूचि है।

तुम कर सकते हो

String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);

यह \आपके में अंतिम के सूचकांक को पुनः प्राप्त करेगा Stringऔर इसके बाद आने वाली हर चीज को निकाल देगा fileName

यदि आपके पास एक Stringअलग विभाजक है, तो lastIndexOfउस विभाजक का उपयोग करने के लिए समायोजित करें । (वहाँ भी एक अधिभार है कि Stringएक विभाजक के रूप में एक पूरे स्वीकार करता है ।)

मैंने इसे ऊपर के उदाहरण में छोड़ दिया है, लेकिन यदि आप अनिश्चित हैं कि कहां से Stringआता है या इसमें क्या हो सकता है, तो आप यह सत्यापित करना चाहेंगे कि lastIndexOfगैर-नकारात्मक मान लौटाता है क्योंकि Javadoc बताता है कि यह वापस आ जाएगा

-1 अगर ऐसी कोई घटना नहीं है


25

1.7 के बाद से

    Path p = Paths.get("c:\\temp\\1.txt");
    String fileName = p.getFileName().toString();
    String directory = p.getParent().toString();

11

आप पथ = C: \ Hello \ OtherFolder \ TheFileName.PDF का उपयोग कर सकते हैं

String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());


2
आपको उनमें से किसी का उपयोग नहीं करना चाहिए क्योंकि यह प्लेटफॉर्म पर निर्भर है। /यूनिक्स और \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like File` या पर Paths
Automatico

3
क्या File.separatorप्लेटफॉर्म भी निर्भर है? या यह काम होगा ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
जोनाथन

File.separator और File.separatorChar दोनों UND / Linux / JDK के macOS संस्करण पर "/" और Windows संस्करण पर दोनों "\" हैं।
54 जैकी

2
File.separatorहमेशा यहां काम नहीं करेगा क्योंकि विंडोज में फ़ाइलनाम को "/"या तो अलग किया जा सकता है या "\\"
डोडगीकोडेक्स अपवाद

10

अन्य उत्तर मेरे विशिष्ट परिदृश्य के लिए काफी काम नहीं करते थे, जहां मैं उन रास्तों को पढ़ रहा हूं जो एक ओएस से मेरे वर्तमान एक से अलग हुए हैं। विस्तृत करने के लिए मैं लिनक्स सर्वर पर विंडोज प्लेटफॉर्म से सहेजे गए ईमेल अटैचमेंट को सहेज रहा हूं। JavaMail API से दिया गया फ़ाइल नाम 'C: \ temp \ hello.xls' जैसा कुछ है

समाधान मैं के साथ समाप्त हो गया:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];

3

इस मामले को ध्यान में रखते हुए कि जावा मल्टीप्लायर है:

int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
    fileName = fileName.substring(lastPath+1);
}

1

किसी भी निर्भरता के बिना एक विधि और .. , का ख्याल रखता है और डुप्लिकेट विभाजक।

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
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"));
}

हो सकता है कि getFileName थोड़ा भ्रामक हो, क्योंकि यह निर्देशिका नामों को भी लौटाता है। यह एक मार्ग में फ़ाइल या अंतिम निर्देशिका का नाम देता है।


0

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;
    }


0

आप अपनी फ़ाइल की सभी जानकारी प्राप्त करने के लिए FileInfo ऑब्जेक्ट का उपयोग कर सकते हैं।

    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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.