2011-08-23 15 views
38

मैं एक सरल कमांड लाइन जावा उपयोगिता लिख ​​रहा हूं। मैं चाहता हूं कि उपयोगकर्ता ~ ऑपरेटर का उपयोग करके अपनी होम निर्देशिका के सापेक्ष फ़ाइल पथ में पास हो सके। तो ~/Documents/...फ़ाइल पथों में ~ कैसे संभालें

जैसे कुछ प्रश्न जावा को इस प्रकार के पथ को स्वचालित रूप से हल करने का कोई तरीका है? या मुझे ~ ऑपरेटर के लिए फ़ाइल पथ स्कैन करने की आवश्यकता है?

ऐसा लगता है कि इस प्रकार की कार्यक्षमता को File ऑब्जेक्ट में बेक किया जाना चाहिए। लेकिन ऐसा प्रतीत नहीं होता है।

+1

कौन सा ओएस (रों) अपने उपयोगिता के लिए है? –

उत्तर

50

एक साधारण path = path.replaceFirst("^~",System.getProperty("user.home")); जब यह (एक File बाहर करने से पहले उपयोगकर्ता से मिल गया है इसके) ज्यादातर मामलों में काम करने के लिए पर्याप्त होना चाहिए।

+5

अधिकांश (सभी?) गोले केवल प्रतिस्थापन निष्पादित करेंगे जब argumetn * के साथ शुरू होता है * '~'। पथ '/ a/~/c/d.txt' का अर्थ बिल्कुल बश द्वारा लिखे गए अनुसार किया जाएगा, उदाहरण के लिए। –

+0

@andrzej अच्छी तरह से पेट्र का समाधान बेहतर है हालांकि मेरा थोड़ा और कॉम्पैक्ट –

+14

बस सावधान रहें कि यह वास्तव में हर समय काम नहीं करता है। "~ अन्य उपयोगकर्ता/दस्तावेज़" एक मान्य होम निर्देशिका भी है; लेकिन, अन्य उपयोगकर्ता के "user.home" के लिए, "user.home" के लिए नहीं। साथ ही, टिल्ड को केवल एक होम निर्देशिका में विस्तारित किया जाता है यदि यह पथ के निर्देशिका खंड में पहला अक्षर है। अपरंपरागत होने पर, "ए ~" एक वैध फ़ाइल है जिसका घर निर्देशिकाओं से कोई लेना देना नहीं है। –

26

यह, खोल विशेष विस्तार है, इसलिए आप, पंक्ति के आरंभ में यह प्रतिस्थापित करने की आवश्यकता है, तो वर्तमान:

String path = "~/xyz"; 
... 
if (path.startsWith("~" + File.separator)) { 
    path = System.getProperty("user.home") + path.substring(1); 
} 

File f = new File(path); 
... 
+4

यह नहीं होना चाहिए 'System.getProperty ("user.home") + path.substring (2); ' –

+0

हाँ, धन्यवाद, तय –

8

जैसा कि एडविन बक ने किसी अन्य उत्तर में टिप्पणी में बताया, ~ अन्य उपयोगकर्ता/दस्तावेजों को भी सही ढंग से विस्तार करना चाहिए। यहाँ एक समारोह है कि मेरे लिए काम किया है:

public String expandPath(String path) { 
    try { 
     String command = "ls -d " + path; 
     Process shellExec = Runtime.getRuntime().exec(
      new String[]{"bash", "-c", command}); 

     BufferedReader reader = new BufferedReader(
      new InputStreamReader(shellExec.getInputStream())); 
     String expandedPath = reader.readLine(); 

     // Only return a new value if expansion worked. 
     // We're reading from stdin. If there was a problem, it was written 
     // to stderr and our result will be null. 
     if (expandedPath != null) { 
      path = expandedPath; 
     } 
    } catch (java.io.IOException ex) { 
     // Just consider it unexpandable and return original path. 
    } 

    return path; 
} 
+1

स्ट्रिंग में पहले चर के रूप में केवल तभी बदलता है क्योंकि यह एलएस पर निर्भर करता है, डेव एम द्वारा प्रदान की गई विस्तार पथ विधि केवल तभी काम करती है जब पथ मौजूद है। – sfosdal

+1

+1 इसके लिए एक नई प्रक्रिया लॉन्च करना एक विशाल ओवरकिल जैसा लगता है, लेकिन यह शायद एकमात्र "सही" तरीका है। – minexew

4

एक काफी सुव्यवस्थित जवाब यह है कि वास्तविक साथ रास्ते के साथ ~ उन्हें में पात्रों काम करता है:

String path = "~/Documents"; 
path.replaceFirst("^~", System.getProperty("user.home")); 
+0

इसमें @ ratchet के उत्तर के समान ही दोष है: '~ foo' को'/home/foo' के बजाय '/ home/yournamefoo' द्वारा प्रतिस्थापित किया जाएगा। – bfontaine

संबंधित मुद्दे