जवाबों:
इन फ़ाइलनामों पर विचार करें:
C:\temp\file.txt
- यह एक मार्ग है, एक निरपेक्ष मार्ग है, और एक विहित मार्ग है।
.\file.txt
- यह एक रास्ता है। यह न तो कोई पूर्ण मार्ग है और न ही कोई विहित मार्ग।
C:\temp\myapp\bin\..\\..\file.txt
- यह एक मार्ग और निरपेक्ष मार्ग है। यह एक विहित मार्ग नहीं है।
एक विहित मार्ग हमेशा एक निरपेक्ष पथ होता है।
एक मार्ग से एक विहित पथ में परिवर्तित करना इसे पूर्ण बनाता है (आमतौर पर वर्तमान काम करने वाली निर्देशिका से निपटता है इसलिए जैसे ./file.txt
बन जाता है c:/temp/file.txt
)। किसी फ़ाइल का विहित पथ केवल पथ को "शुद्ध" करता है, जैसे सामान को हटाना और हल करना और ..\
सीक्लिंक्स (यूनिक्स पर) को हल करना।
Nio.Paths के साथ निम्नलिखित उदाहरण पर भी ध्यान दें:
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
एक विहित पथ है - अस्थायी निर्देशिका एक फाइल सिस्टम सॉफ्ट लिंक या हार्ड लिंक (एनटीएफएस में एक जंक्शन) हो सकती है, और फाइल सॉफ्ट एक नरम लिंक हो सकती है। मुझे नहीं पता कि फाइल सिस्टम फाइलों के हार्ड लिंक को अलग कर सकता है या नहीं।
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()
प्रणाली पर निर्भर है। यह उस अद्वितीय स्थान को हल करेगा जिसका प्रतिनिधित्व पथ करता है। इसलिए यदि आपके पास कोई रास्ता है तो वे आमतौर पर हटा दिए जाएंगे।
इनका उपयोग कब करना है। यह इस बात पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। 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()
लेकिन, अगर फ़ाइल को फ़ाइलनाम के साथ दिया जाता है जो कि विंडोज पर DOS 8.3 प्रारूप में है, जैसे कि java.io.tmpdir
सिस्टम प्रॉपर्टी रिटर्न, तो यह विधि "पूर्ण" फ़ाइल नाम लौटाएगी।
Path.toAbsolutePath().normalize()
जो विहित (वास्तविक) पथ और पूर्ण पथ के बीच एक अच्छा मध्य मैदान है।