2012-03-14 6 views
9

मैं आंशिक पथ और निर्देशिका नामों को जोड़कर एलिसप में मैन्युअल रूप से पथ तारों का निर्माण कर रहा हूं। दुर्भाग्यवश कभी-कभी पथ स्लैश के साथ समाप्त होते हैं, कभी-कभी नहीं। इसलिए, मुझे आवश्यक होने पर निर्देशिका नाम को संयोजित करने से पहले स्लैश डालने की आवश्यकता है लेकिन अन्यथा नहीं। ऐसा करने का एक अच्छा तरीका क्या है?एलिसप में, स्लैश के साथ पथ स्ट्रिंग को सही ढंग से डालने के तरीके कैसे प्राप्त करें?

+0

लिनक्स पर, फ़ाइल पथ में // प्रतीकों को दोगुना कर दिया जाता है आमतौर पर (हमेशा मुझे लगता है) एक एकल के रूप में व्याख्या किया जाता है, इसलिए अतिरिक्त व्यक्ति को कोई समस्या नहीं होनी चाहिए। – Tyler

+0

इसे सभी प्लेटफ़ॉर्म पर काम करने की आवश्यकता है। – qazwsx

उत्तर

12

(file-name-as-directory dir) एक पिछला स्लैश के साथ निर्देशिका पथ dir वापस करेगा, यदि आवश्यक हो तो एक जोड़ना, और अन्यथा नहीं।

(let ((directory-list '("/foo" "bar/" "p/q/" "x/y")) 
     (file-name "some_file.el")) 
    (concat 
    (mapconcat 'file-name-as-directory directory-list "") 
    file-name)) 

"/foo/bar/p/q/x/y/some_file.el" 

या एक विकल्प के रूप में, यदि आप सूची में फ़ाइल नाम शामिल करना चाहता था, आप directory-file-name उपयोग कर सकता है:

आप एक सूची में आंशिक रास्तों में से अपने अनुक्रम था, तो आप की तरह कुछ कर सकता है जो करता है file-name-as-directory के विपरीत:

(let ((path-list '("/foo" "bar/" "p/q/" "x/y/some_file.el"))) 
    (mapconcat 'directory-file-name path-list "/")) 

"/foo/bar/p/q/x/y/some_file.el" 

(? किसी ने मुझे सही करें अगर एक गैर-निर्देशिका पर directory-file-name का उपयोग कर पोर्टेबल नहीं है)

+0

क्या होगा यदि इसमें '/' उदा। '"/P/q/"'? – qazwsx

+0

यदि यह शुरुआत में है, तो कोई समस्या नहीं है (ऊपर मेरे उदाहरण के अनुसार)। यदि यह शुरुआत में नहीं है, तो पथ पथ के अनुक्रम के बीच में एक पूर्ण पथ का कोई व्यवसाय नहीं है, जिससे कि उस अनुक्रम को उत्पन्न करने वाले तर्क में एक बग का सुझाव दिया जा सके। – phils

+0

क्या यह एक पोर्टेबिलिटी समस्या नहीं है जिसे आप स्पष्ट रूप से पारिस्थितिक उदाहरण में "/" का उपयोग कर रहे हैं? –

1

इस तरह कुछ एक प्रारंभिक बिंदु के रूप में, आदि काम करना चाहिए, हालांकि आप इसे मंच स्वतंत्र बनाने के लिए एक सा बाहर मांस के लिए चाहते हैं

(defun append-path-component (path new-part) 
    (if (string-match ".*/$" path) 
    (concat path new-part) 
    (concat path "/" new-part))) 

सामान्य के अनुसार, वहाँ शायद elisp के कुछ सा जो पहले से ही ऐसा करता है कि मुझे अभी पता नहीं है।

+0

धन्यवाद।इसके अलावा, मैं उन संभावित रूप से मौजूदा अंतर्निहित और फीचरफुल फ़ंक्शन की तलाश में था। – qazwsx

+0

यह एक पोर्टेबिलिटी विफल है। आपको अपने लिस्प कोड में कभी भी पथ अलग नहीं करना चाहिए। –

+0

event_jr: 'directory-sep-char' लंबे अप्रचलित है, और इसे पूरी तरह से Emacs 24 में हटा दिया गया है। पुराने डॉकस्ट्रिंग ने कहा" मान हमेशा होता है "/'। इस चर का उपयोग न करें, बस '/ 'का उपयोग करें। " – phils

0
(defun* tofilename (directorylist &optional (filename nil)) 
    "concatenate directory names into a path, with an optional file name as last part" 
    (concat 
    (mapconcat 'directory-file-name directorylist "/") 
    "/" 
    filename)) 


(tofilename '("~/" "Temp/") "temp.txt") 
;; => "~/Temp/temp.txt" 

(tofilename '("~/" "Temp/")) 
;; => "~/Temp/" 

(tofilename '("~/" "Temp/" "test")) 
;; => "~/Temp/temp/" 
3

संदिग्ध सामग्री के कुछ हिस्सों से फ़ाइल नाम इकट्ठा करने का सबसे आसान तरीका विस्तार-फ़ाइल-नाम के साथ है। उदाहरण के लिए:

(expand-file-name "foo.txt") 

इस आम रूप आप एक पूर्ण फ़ाइल नाम डिफ़ॉल्ट-निर्देशिका के आधार पर दे देंगे:

/home/me/foo.txt 

लेकिन आप एक चर 'निर्देशिका' जिनकी सामग्री "/ घर/उन्हें है अगर/subdir "और उस का उपयोग करना चाहते हैं, तो ऐसा:

(expand-file-name "foo.txt" dir) 

यह फर्क नहीं पड़ता अगर dir में समाप्त होता है/या नहीं। यदि आप किसी अन्य प्लेटफ़ॉर्म पर हैं, और इसमें अन्य स्लैश हैं, तो यह भी सही काम करेगा। क्या आपके पास मिश्रण है? बस उन्हें ढेर:

(expand-file-name "foo.txt" (expand-file-name "somesubdir" dir)) 
1

जब तक आप वास्तव में रिश्तेदार के रूप में रिश्तेदार फ़ाइल नाम रखने के बारे में परवाह है, तो यह हमेशा काफी बेहतर concat से बचने और बजाय expand-file-name उपयोग करने के लिए है।

+0

क्या आप दोनों के अंतर को दर्शाने के लिए एक उदाहरण दिया जा सकता है? – qazwsx

0

यदि आप फ़ाइल मैनिपुलेशन के साथ सौदा करते हैं, फ़ाइलपैथ में शामिल होने और विभाजित करते हैं, खाली निर्देशिकाओं की जांच करते हैं और ऐसे में, मैं दृढ़ता से f.el, आधुनिक फ़ाइल मैनिपुलेशन लाइब्रेरी स्थापित करने की सलाह देता हूं। आपके पास एक नामस्थान के तहत फ़ाइल और फ़ाइलपैथ मैनिपुलेशन फ़ंक्शंस का एक बड़ा सेट होगा और फिर कभी पहिया को फिर से नहीं चलाएगा।

आपको जिस फ़ंक्शन की आवश्यकता है वह f-join है, यह पथ के कुछ हिस्सों को जोड़ता है, जहां आवश्यक हो वहां स्लैश जोड़ता है।

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