GetPath (), getAbsolvePath (), এবং জাভায় getCanonicalPath () এর মধ্যে পার্থক্য কী?


583

মধ্যে পার্থক্য কি getPath(), getAbsolutePath()এবং getCanonicalPath()জাভা?

এবং আমি কখন প্রতিটি ব্যবহার করব?


ভুলে যাবেন না Path.toAbsolutePath().normalize()যা এককভাবে ক্যানোনিকাল (বাস্তব) পাথ এবং পরম পথের মধ্যে একটি ভাল মাঝারি স্থল।
উপস্থাপিত

উত্তর:


625

এই ফাইলের নামগুলি বিবেচনা করুন:

C:\temp\file.txt - এটি একটি পথ, পরম পথ এবং একটি প্রচলিত পথ।

.\file.txt- এটা একটা পথ। এটি একটি নিখুঁত পথ বা একটি প্রচলিত পথ নয়।

C:\temp\myapp\bin\..\\..\file.txt- এটি একটি পথ এবং পরম পথ। এটি কোনও আধ্যাত্মিক পথ নয়।

একটি প্রচলিত পথ সর্বদা একটি পরম পথ।

কোনও পাথ থেকে ক্যানোনিকাল পাথে রূপান্তরকরণ এটিকে নিখুঁত করে তোলে (সাধারণত বর্তমান কার্যনির্বাহী ডিরেক্টরিতে ট্যাক্স ./file.txtথাকে যেমন উদাহরণস্বরূপ হয় c:/temp/file.txt)। কোনও ফাইলের ক্যানোনিকাল পাথ ..\সিমলিংকের মতো উপাদানগুলিকে সরিয়ে এবং সমাধান করে (ইউনিক্সে) সমাধান করে, পথটিকে কেবল " পরিশোধিত করে"।

নিও.পাথগুলি সহ নিম্নলিখিত উদাহরণটিও নোট করুন:

String canonical_path_string = "C:\\Windows\\System32\\";
String absolute_path_string = "C:\\Windows\\System32\\drivers\\..\\";

System.out.println(Paths.get(canonical_path_string).getParent());
System.out.println(Paths.get(absolute_path_string).getParent());

উভয় পাথ একই অবস্থানের কথা উল্লেখ করলেও আউটপুটটি একেবারেই আলাদা হবে:

C:\Windows
C:\Windows\System32\drivers

11
এফডাব্লুআইডাব্লু, এটি কোনও প্রদত্ত নয় যা C:\temp\file.txtক্যানোনিকাল পাথ - অস্থায়ী ডিরেক্টরিটি কোনও ফাইল সিস্টেমের সফট লিঙ্ক বা হার্ড লিঙ্ক (এনটিএফএসের একটি জংশন) হতে পারে, এবং file.txt একটি নরম লিঙ্ক হতে পারে। আমি জানি না যে ফাইল সিস্টেমগুলি ফাইলগুলির হার্ড লিঙ্কগুলিকে আলাদা করতে পারে।
লরেন্স ডল

1
পাথ এই বিষয়গুলি বা উপাদানগুলির কোনওটির অস্তিত্বকে সত্যই বিবেচনা করে না, কেবল এটির বাক্য গঠন।
Escape-llc

এটি করে, প্রচলিত পথটি (সাধারণীকৃত পাথের বিপরীতে) ফাইল সিস্টেমকে আঘাত করে।
উপস্থাপিত

1
মূলত, এর getAbsolutePath()পরিবর্তে কারও ব্যবহার করার কারণ আমি দেখতে পাচ্ছি না getCanonicalPath()। এমনকি এটি আরও ভাল দেখায় কারণ ক্যানোনিকালটি সেই ../অংশগুলি স্বয়ংক্রিয়ভাবে সমাধান করে ।
স্ক্যাজ

ভুলে যাবেন না যে কিছুক্ষণ getCanonicalPathছুড়ে না, যদি এটি বিবেচনা করা হয়। IOExceptiongetAbsolutePath
পরিত্যক্ত কার্ট

129

এই জাতীয় জিনিসগুলির জন্য অনুভূতি পাওয়ার সবচেয়ে ভাল উপায়টি তাদের চেষ্টা করে দেখুন:

import java.io.File;
public class PathTesting {
    public static void main(String [] args) {
        File f = new File("test/.././file.txt");
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());
        try {
            System.out.println(f.getCanonicalPath());
        }
        catch(Exception e) {}
    }
}

আপনার আউটপুট এমন কিছু হবে:

test\..\.\file.txt
C:\projects\sandbox\trunk\test\..\.\file.txt
C:\projects\sandbox\trunk\file.txt

সুতরাং, getPath()আপনাকে ফাইল অবজেক্টের ভিত্তিতে পাথ দেয় যা আপেক্ষিক হতে পারে বা নাও হতে পারে; getAbsolutePath()আপনাকে ফাইলটিতে একটি পরম পথ দেয়; এবংgetCanonicalPath() আপনাকে ফাইলের অনন্য পরম পাথ দেয়। লক্ষ্য করুন যে এখানে প্রচুর সংখ্যক পরম পথ রয়েছে যা একই ফাইলটিতে নির্দেশ করে তবে কেবল একটি নীতিগত পথ।

কখন ব্যবহার করবেন? আপনি কী সম্পাদন করতে চাইছেন তার উপর নির্ভরশীল, তবে আপনি যদি Filesডিস্কে দুটি একই ফাইলের দিকে ইশারা করছেন কিনা তা দেখার চেষ্টা করছিলেন, তবে আপনি তাদের আধ্যাত্মিক পথগুলির তুলনা করতে পারেন। শুধু একটি উদাহরণ।


7
এটি তর্কযোগ্য যে জাভা এটি একটি "পরম" পথটি ভুলভাবে প্রয়োগ করেছে; এটি সত্যই কোনও নিখুঁত পথে কোনও আপেক্ষিক পাথ উপাদান সরিয়ে ফেলতে হবে। ক্যানোনিকাল ফর্ম তারপরে পথে কোনও এফএস লিঙ্ক বা জংশনগুলি সরিয়ে ফেলবে।
লরেন্স ডল

but if you were trying to see if two Files are pointing at the same file on diskকিভাবে? উদাহরণস্বরূপ?
আসিফ মোশতাক

@ অজানা: আপনি এর জন্য ক্যানোনিকাল পাথটি ব্যবহার করবেন।
লরেন্স ডল

67

সংক্ষেপে:

  • getPath()Fileঅবজেক্টটি যে পাথ স্ট্রিংয়ের সাহায্যে নির্মিত হয়েছিল তা পেতে পারে এবং এটি বর্তমান ডিরেক্টরি হতে পারে।
  • getAbsolutePath() বর্তমান ডিরেক্টরি যদি এটি সম্পর্কিত হয় তবে এটির পরিপন্থী একটি পুরোপুরি যোগ্য পাথের বিপরীতে সমাধানের পরে পাথের স্ট্রিং পায়।
  • getCanonicalPath()বর্তমান ডিরেক্টরিটির বিরুদ্ধে কোনও আপেক্ষিক পাথ সমাধান করার পরে পাথ স্ট্রিংটি পাওয়া যায় এবং কোনও আপেক্ষিক পাথিং ( .এবং ..) সরিয়ে দেয় এবং যে কোনও ফাইল সিস্টেমের লিঙ্ক এমন কোনও পথ ফেরত দেয় যা ফাইল সিস্টেমের দ্বারা চিহ্নিত করা ফাইল সিস্টেমের বিষয়টিকে রেফারেন্সের জন্য নীতিগত উপায় হিসাবে বিবেচনা করে।

এছাড়াও, এর প্রত্যেকটির একটি ফাইল সমতুল্য যা সংশ্লিষ্ট Fileঅবজেক্টটি প্রদান করে।


36

getPath()Fileঅবজেক্ট তৈরি করতে ব্যবহৃত পাথ ফেরত দেয় । এই রিটার্ন মানটি যে স্থানটিতে চালিত হয়েছে তার উপর ভিত্তি করে পরিবর্তন করা হয়নি (নীচের ফলাফলগুলি উইন্ডোগুলির জন্য, বিভাজক স্পষ্টতই অন্য কোথাও আলাদা)

File f1 = new File("/some/path");
String path = f1.getPath(); // will return "\some\path"

File dir = new File("/basedir");
File f2 = new File(dir, "/some/path");
path = f2.getPath(); // will return "\basedir\some\path"

File f3 = new File("./some/path");
path = f3.getPath(); // will return ".\some\path"

getAbsolutePath()নির্বাহের অবস্থান বা ড্রাইভের ভিত্তিতে পাথটি সমাধান করবে। সুতরাং যদি চালানো হয় c:\test:

path = f1.getAbsolutePath(); // will return "c:\some\path"
path = f2.getAbsolutePath(); // will return "c:\basedir\some\path"
path = f3.getAbsolutePath(); // will return "c:\test\.\basedir\some\path"

getCanonicalPath()সিস্টেম নির্ভর এটি পথটি উপস্থাপন করে এমন অনন্য অবস্থানটি সমাধান করবে। সুতরাং আপনার যদি "" "কোনও পথে থাকে তবে সেগুলি সাধারণত সরানো হবে।

কখন সেগুলি ব্যবহার করবেন to এটি আপনি কী অর্জন করার চেষ্টা করছেন তার উপর নির্ভর করে। getPath()বহনযোগ্যতার জন্য দরকারী। getAbsolutePath()ফাইল সিস্টেমের অবস্থানটি সন্ধান getCanonicalPath()করতে দরকারী এবং দুটি ফাইল একই কিনা তা পরীক্ষা করতে বিশেষভাবে কার্যকর।


আপনি আমাকে এর কোন উদাহরণ দিতে পারেন? getCanonicalPath() is particularly useful to check if two files are the same.
আসিফ মোশতাক

20

আপনার মাথা ঘুরিয়ে দেওয়ার জন্য বড় বিষয়টি হল Fileশ্রেণিটি সানকে "শ্রেণিবদ্ধ পথনির্দেশগুলি" বলতে মূলত (মূলত একটি পথের মতো c:/foo.txtবা /usr/muggins) বলতে একটি দৃষ্টিভঙ্গি উপস্থাপন করার চেষ্টা করে । এই কারণেই আপনি পাথের ক্ষেত্রে ফাইল তৈরি করেন। আপনি যে অপারেশনগুলি বর্ণনা করছেন সেগুলি এই "পথের নাম" এর উপর নির্ভর করে।

  • getPath()( ../foo.txt) দিয়ে ফাইলটি তৈরি করা হয়েছিল এমন পথটি নিয়ে আসে
  • getAbsolutePath()ফাইলটি যে পথ দিয়ে তৈরি করা হয়েছিল তা সন্ধান করে তবে বর্তমান ডিরেক্টরিটি সম্পর্কে তথ্য অন্তর্ভুক্ত করে যদি সেই পথটি আপেক্ষিক হয় ( /usr/bobstuff/../foo.txt)
  • getCanonicalPath() ফাইলটিতে পরম পথের একটি অনন্য উপস্থাপনা আনার চেষ্টা করে। এটি ".." এবং "থেকে" দিকনির্দেশকে সরিয়ে দেয়। তথ্যসূত্র ( /usr/foo.txt)।

নোট আমি চেষ্টা বলছি - একটি ক্যানোনিকাল পথ তৈরি করার সময়, ভিএম একটি নিক্ষেপ করতে পারে IOException। এটি সাধারণত ঘটে থাকে কারণ এটি কিছু ফাইল সিস্টেম অপারেশন করছে, যার যে কোনও একটি ব্যর্থ হতে পারে।


3

আমি দেখতে পাচ্ছি আমার খুব কমই ব্যবহার করার দরকার আছে getCanonicalPath()তবে, যদি উইন্ডোজের ডস 8.3 ফর্ম্যাটে থাকা কোনও ফাইল নাম সহ কোনও ফাইল দেওয়া হয় যেমন java.io.tmpdirসিস্টেমের সম্পত্তি ফেরত দেয়, তবে এই পদ্ধতিটি "পূর্ণ" ফাইলের নামটি ফিরিয়ে দেবে।

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