java - অবজ - লিটারেল কাকে বলে




পরম ফাইল পাথ ধারণকারী একটি স্ট্রিং থেকে আমি ফাইলের নাম কিভাবে পেতে পারি? (7)

1.7 থেকে

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

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

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


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

সমাধান আমি শেষ পর্যন্ত:

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

আপনি যে 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 ব্যবহার করার জন্য শেষ lastIndexOf সামঞ্জস্য করুন। (একটি overload এমনকি একটি বিভাজক হিসাবে একটি সম্পূর্ণ String গ্রহণ করে।)

আমি উপরের উদাহরণে এটি বাদ দিয়েছি, তবে String কোনটি থেকে আসে বা এটিতে কী হতে পারে সে বিষয়ে আপনি নিশ্চিত না হন তবে আপনি lastIndexOf যাচাই করতে lastIndexOf যে শেষ lastIndexOf একটি অ-নেতিবাচক মান প্রদান করে কারণ lastIndexOf overload এটি ফিরে আসবে

-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 একটি বিভ্রান্তিকর, কারণ এটি ডিরেক্টরি নাম ফেরত দেয়। এটি একটি পাথের ফাইল বা সর্বশেষ ডিরেক্টরি নাম প্রদান করে।


জাভা মাল্টিপ্ল্যাটফ্টের ক্ষেত্রে বিবেচনা করুন:

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

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

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

মনে রাখবেন যে \\ স্ট্রিংটি বিভক্ত করা হচ্ছে প্ল্যাটফর্মের উপর ভিত্তি করে ফাইল বিভাজক পরিবর্তিত হতে পারে। Path#getName আপনার জন্য সেই সমস্যাটির যত্ন নেয়।







filepath