উত্তর:
এই ফাইলের নামগুলি বিবেচনা করুন:
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
C:\temp\file.txt
ক্যানোনিকাল পাথ - অস্থায়ী ডিরেক্টরিটি কোনও ফাইল সিস্টেমের সফট লিঙ্ক বা হার্ড লিঙ্ক (এনটিএফএসের একটি জংশন) হতে পারে, এবং file.txt একটি নরম লিঙ্ক হতে পারে। আমি জানি না যে ফাইল সিস্টেমগুলি ফাইলগুলির হার্ড লিঙ্কগুলিকে আলাদা করতে পারে।
getAbsolutePath()
পরিবর্তে কারও ব্যবহার করার কারণ আমি দেখতে পাচ্ছি না getCanonicalPath()
। এমনকি এটি আরও ভাল দেখায় কারণ ক্যানোনিকালটি সেই ../
অংশগুলি স্বয়ংক্রিয়ভাবে সমাধান করে ।
getCanonicalPath
ছুড়ে না, যদি এটি বিবেচনা করা হয়। IOException
getAbsolutePath
এই জাতীয় জিনিসগুলির জন্য অনুভূতি পাওয়ার সবচেয়ে ভাল উপায়টি তাদের চেষ্টা করে দেখুন:
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
ডিস্কে দুটি একই ফাইলের দিকে ইশারা করছেন কিনা তা দেখার চেষ্টা করছিলেন, তবে আপনি তাদের আধ্যাত্মিক পথগুলির তুলনা করতে পারেন। শুধু একটি উদাহরণ।
but if you were trying to see if two Files are pointing at the same file on disk
কিভাবে? উদাহরণস্বরূপ?
সংক্ষেপে:
getPath()
File
অবজেক্টটি যে পাথ স্ট্রিংয়ের সাহায্যে নির্মিত হয়েছিল তা পেতে পারে এবং এটি বর্তমান ডিরেক্টরি হতে পারে।getAbsolutePath()
বর্তমান ডিরেক্টরি যদি এটি সম্পর্কিত হয় তবে এটির পরিপন্থী একটি পুরোপুরি যোগ্য পাথের বিপরীতে সমাধানের পরে পাথের স্ট্রিং পায়।getCanonicalPath()
বর্তমান ডিরেক্টরিটির বিরুদ্ধে কোনও আপেক্ষিক পাথ সমাধান করার পরে পাথ স্ট্রিংটি পাওয়া যায় এবং কোনও আপেক্ষিক পাথিং ( .
এবং ..
) সরিয়ে দেয় এবং যে কোনও ফাইল সিস্টেমের লিঙ্ক এমন কোনও পথ ফেরত দেয় যা ফাইল সিস্টেমের দ্বারা চিহ্নিত করা ফাইল সিস্টেমের বিষয়টিকে রেফারেন্সের জন্য নীতিগত উপায় হিসাবে বিবেচনা করে।এছাড়াও, এর প্রত্যেকটির একটি ফাইল সমতুল্য যা সংশ্লিষ্ট File
অবজেক্টটি প্রদান করে।
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.
আপনার মাথা ঘুরিয়ে দেওয়ার জন্য বড় বিষয়টি হল File
শ্রেণিটি সানকে "শ্রেণিবদ্ধ পথনির্দেশগুলি" বলতে মূলত (মূলত একটি পথের মতো c:/foo.txt
বা /usr/muggins
) বলতে একটি দৃষ্টিভঙ্গি উপস্থাপন করার চেষ্টা করে । এই কারণেই আপনি পাথের ক্ষেত্রে ফাইল তৈরি করেন। আপনি যে অপারেশনগুলি বর্ণনা করছেন সেগুলি এই "পথের নাম" এর উপর নির্ভর করে।
getPath()
( ../foo.txt
) দিয়ে ফাইলটি তৈরি করা হয়েছিল এমন পথটি নিয়ে আসেgetAbsolutePath()
ফাইলটি যে পথ দিয়ে তৈরি করা হয়েছিল তা সন্ধান করে তবে বর্তমান ডিরেক্টরিটি সম্পর্কে তথ্য অন্তর্ভুক্ত করে যদি সেই পথটি আপেক্ষিক হয় ( /usr/bobstuff/../foo.txt
)getCanonicalPath()
ফাইলটিতে পরম পথের একটি অনন্য উপস্থাপনা আনার চেষ্টা করে। এটি ".." এবং "থেকে" দিকনির্দেশকে সরিয়ে দেয়। তথ্যসূত্র ( /usr/foo.txt
)।নোট আমি চেষ্টা বলছি - একটি ক্যানোনিকাল পথ তৈরি করার সময়, ভিএম একটি নিক্ষেপ করতে পারে IOException
। এটি সাধারণত ঘটে থাকে কারণ এটি কিছু ফাইল সিস্টেম অপারেশন করছে, যার যে কোনও একটি ব্যর্থ হতে পারে।
আমি দেখতে পাচ্ছি আমার খুব কমই ব্যবহার করার দরকার আছে getCanonicalPath()
তবে, যদি উইন্ডোজের ডস 8.3 ফর্ম্যাটে থাকা কোনও ফাইল নাম সহ কোনও ফাইল দেওয়া হয় যেমন java.io.tmpdir
সিস্টেমের সম্পত্তি ফেরত দেয়, তবে এই পদ্ধতিটি "পূর্ণ" ফাইলের নামটি ফিরিয়ে দেবে।
Path.toAbsolutePath().normalize()
যা এককভাবে ক্যানোনিকাল (বাস্তব) পাথ এবং পরম পথের মধ্যে একটি ভাল মাঝারি স্থল।