আমি কীভাবে কোনও স্ট্রিং থেকে পরম ফাইল পাথ যুক্ত ফাইলের নাম পাই?


236

Stringভেরিয়েবল একটি ফাইলের নাম ধারণ করে C:\Hello\AnotherFolder\The File Name.PDF। আমি কীভাবে কেবল The File Name.PDFস্ট্রিং হিসাবে ফাইলের নাম পাই ?

আমি স্ট্রিংটি বিভক্ত করার পরিকল্পনা করেছি, তবে এটি সর্বোত্তম সমাধান নয়।


রেফারেন্স সহ issuetracker.google.com/issues/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));

সহায়ক। ধন্যবাদ।
পূজা 18

"/" এর পরিবর্তে "with" এর পরিবর্তে
পথের নামগুলি সম্পর্কে

278

বিকল্প ব্যবহার Path(জাভা 7+):

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

নোট করুন যে স্ট্রিংটি বিভক্ত \\করা প্ল্যাটফর্ম নির্ভর কারণ ফাইল বিভাজক পৃথক হতে পারে। Path#getNameআপনার জন্য এই সমস্যাটির যত্ন নেয়।


1
এই প্রশ্নের বিভিন্ন পদ্ধতির সাথে কি কেউ পারফরম্যান্স তুলনা করেছেন?
পিষ্ট করুন

@ ক্রাশ আমার মনে হয় না যে Paths.getফাইল সিস্টেমটি অ্যাক্সেস করে তাই কোনও স্ট্রিং / ইনডেক্সফ থেকে পারফরম্যান্সটি বস্তুগতভাবে আলাদা হবে বলে আশা করি না।
Assylias

7
কীভাবে এটি অ্যান্ড্রয়েডে বিদ্যমান নেই? অদ্ভুত।
অ্যান্ড্রয়েড বিকাশকারী

12
হ্যাঁ, স্ল্যাশ / ব্যাকস্ল্যাশের প্ল্যাটফর্ম নির্ভর সমস্যার সাথে পাথ অনুলিপি করে তবে কেবল ফাইল ফাইলটি একই মেশিন (বা প্ল্যাটফর্ম) থেকে আসে। এই বিবেচনা করুন: আপনার কাছ থেকে ফাইল আপলোড Internet Explorerএবং এটি পথ রয়েছে "C:\\Hello\\AnotherFolder\\The File Name.PDF"কিন্তু আপনার কোড একটি ইউনিক্স / লিনাক্স মেশিনে কাজ করছে তারপর p.getFileName()গোটা পাথ ফিরে আসবো, শুধু The File Name.PDF
nyxz

3
কলিং toString()তাই বিশ্রী।
পেট্রো ক্লিফ 3:38

53

ব্যবহার FilenameUtilsমধ্যে এ্যাপাচি কমন্স আই :

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

5
আমি মনে করি এটি সেরা হতে পারে, কারণ কখনও কখনও আপনাকে অন্য প্ল্যাটফর্ম থেকে ফাইলের পথটি প্রক্রিয়া করতে হতে পারে
ruiruige1991

সহজ পড়তে, সবচেয়ে শক্তসমর্থ, কম অবজেক্ট কোড + 1-এ cludder এই শ্রেষ্ঠ কারণ
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রিটার্ন একটি অ-নেতিবাচক মান দেয় কারণ জাভাডোক বলে যে এটি ফিরে আসবে

-1 যদি এরকম কোনও ঘটনা না ঘটে


25

১.7০ সাল থেকে

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

11

আপনি পাথ = সি: \ হ্যালো \ অন্য ফোল্ডার \ TheFileName.PDF ব্যবহার করতে পারেন

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

আপনার should এর পরিবর্তে use ব্যবহার করা উচিত
অনুপ চন্দ্রিকা হরিসুধননায়ার

2
প্ল্যাটফর্ম নির্ভর হওয়ায় আপনার কোনওটি ব্যবহার করা উচিত নয়। /ইউনিক্স এবং \`(AND THERE IS A BUG IN THE MARKDOWN PARSER HERE) on windows. You can't know. Use another solution like ফাইল` বা এ Paths
অটোম্যাটিকো

3
কি File.separatorএছাড়াও প্ল্যাটফর্মের উপর নির্ভরশীল? বা এই কাজ করবে ... String strPath = path.substring(path.lastIndexOf(File.separator)+1, path.length());
জোনাথন

ফাইল.স্যাপারেটর এবং ফাইল.সেস্পোরটরচর দুটি ইউএনএক্স / লিনাক্স / জেডিকে ম্যাকোস সংস্করণে এবং "উইন্ডোজ সংস্করণে" \ "উভয়ই।
ack জ্যাকি

2
File.separatorএখানে সর্বদা কাজ করবে না কারণ উইন্ডোজে কোনও ফাইল নাম হয় "/"বা দ্বারা পৃথক করা যায় "\\"
ডডজি কোডএক্সপশন

10

অন্যান্য উত্তরগুলি আমার নির্দিষ্ট দৃশ্যের জন্য পুরোপুরি কার্যকর হয়নি, যেখানে আমি আমার বর্তমানের চেয়ে ওএস থেকে পৃথক হওয়া পাথগুলি পড়ছি। বিস্তারিত বলতে আমি একটি লিনাক্স সার্ভারে উইন্ডোজ প্ল্যাটফর্ম থেকে সংরক্ষিত ইমেল সংযুক্তিগুলি সংরক্ষণ করছি। জাভামেল এপিআই থেকে ফিরে আসা ফাইলের নামটি 'সি: \ টেম্পিয়াল \ হ্যালো.এক্সলস' এর মতো কিছু is

সমাধানটি দিয়ে আমি শেষ করেছি:

String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 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

জাভা রেজেেক্স * ব্যবহার করে ফাইলের নাম বের করুন।

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 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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.