2008-12-17 6 views
212

में फ़ाइल पथ से एक्सटेंशन के बिना फ़ाइल नाम कैसे प्राप्त करें रूबी में फ़ाइल पथ से फ़ाइल नाम कैसे प्राप्त कर सकता हूं?रूबी

उदाहरण के लिए यदि मेरे पास "C:\projects\blah.dll" का पथ है और मुझे बस "ब्लै" चाहिए।

क्या रूबी में LastIndexOf विधि है?

+3

प्रयास करें एक डॉट कुछ के बाद के बारे में कुछ खास नहीं है कि ध्यान में रखें (तीन, शायद) वर्ण। वे फ़ाइल के नाम का हिस्सा हैं। कुछ फ्रिंज ऑपरेटिंग सिस्टम सोचते हैं कि फ़ाइल नाम के उस हिस्से के बारे में कुछ खास है, लेकिन आपको उस जाल में नहीं आना चाहिए। –

उत्तर

90
require 'pathname' 

Pathname.new('/opt/local/bin/ruby').basename 
# => #<Pathname:ruby> 

मैं एक लंबे समय में एक विंडोज़ प्रयोक्ता नहीं किया गया है, लेकिन पथ नाम rdoc कहते हैं कि यह विंडोज पर निर्देशिका-नाम विभाजक के साथ कोई समस्या नहीं है।

+76

मुझे नहीं पता कि यह # 1 रैंकिंग उत्तर क्यों है जब File.basename को 'पथनाम' की अतिरिक्त 'आवश्यकता' की आवश्यकता नहीं है। – GroovyCakes

+10

कक्षा 'पथनाम' स्थानीय पथनामों के साथ काम करता है जबकि 'फाइल' हमेशा यूनिक्स पथनाम मानता है (अंतर पथ और ड्राइव विभाजक हैं जो एमएस विंडोज़ में उपयोग किए जाते हैं, उदाहरण के लिए) – nimrodm

+0

@ कोर्च: आपको शायद' पथनाम 'नया ("सी:/कुछ/पथ" का अलग व्यवहार दिखाना चाहिए) .basename' to file.basename ("सी:/कुछ/पथ") '(निमोडोड से टिप्पणी देखें) –

564

File.basename

रिटर्न फाइल नाम file_name में दी गई है, जो आगे स्लैश का उपयोग कर का गठन किया जाना चाहिए (``/'') स्थानीय फाइल सिस्टम पर इस्तेमाल किया विभाजक की परवाह किए बिना के अंतिम घटक का प्रयास करें। यदि प्रत्यय दिया गया है और file_name के अंत में मौजूद है, तो इसे हटा दिया जाता है।

File.basename("/home/gumby/work/ruby.rb")   #=> "ruby.rb" 
File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby" 

आपके मामले में:

File.basename("C:\\projects\\blah.dll", ".dll") #=> "blah" 
+0

लिनक्स और रूबी के साथ 1.8 मैं 'pathname.new (" कुछ/पथ/से/my.file ") का प्रयास करें। बेसनाम 'और' my.file /': '( –

+57

अधिक सामान्य रूप से,' File.basename ("C : \\ परियोजनाएं \\ blah.dll ","। * ") # =>" blah "' – kelloti

3

ध्यान दें कि दोहरे उद्धरण चिह्नों तार से बचने के '\ रों।

'C:\projects\blah.dll'.split('\\').last 
+5

पथ के बजाए इसे स्ट्रिंग के रूप में पूरी तरह से मानता है, कोड को कम पोर्टेबल बनाता है। – boatcoder

7

जोनाथन का जवाब बेहतर है, लेकिन क्या आप जानते हैं somelist[-1]LastIndexOf उपलब्ध अंकन में से एक है यह बताने के लिए।

के रूप में krusty.ar का उल्लेख somelist.last स्पष्ट रूप से भी है।

irb(main):003:0* f = 'C:\\path\\file.txt' 
irb(main):007:0> f.split('\\') 
=> ["C:", "path", "file.txt"] 
irb(main):008:0> f.split('\\')[-1] 
=> "file.txt" 
+1

समस्या यह है कि आप यह जानने की ज़रूरत है कि यह बैकस्लैश है या आगे की ओर –

53

मामले में विस्तार से ज्ञात नहीं है (यह/विभाजक की जरूरत है):

irb(main):024:0> f = 'C:\foobar\blah.txt'.gsub("\\","/") 
=> "C:/foobar/blah.txt" 
irb(main):027:0> File.basename(f,File.extname(f)) 
=> "blah" 
+5

File.basename() जवाब है! – sivabudh

0

आप ENV चर के लिए उपयोग किया है, तो scan इस छोटे regex (जो पिछले लेकिन एक शब्द पाता है के साथ संयुक्त, एक जाहिर है

filename = ENV['SCRIPT_NAME'].scan(/\w+\.\w+$/) 

, आप scan और किसी भी पथ नाम है कि फ़ाइल नाम भी शामिल है पर regex का उपयोग कर सकते हैं और __FILE__ स्पष्ट है: डॉट, तो स्ट्रिंग के अंतिम शब्द) 'फ़ाइल नाम' में फ़ाइल का नाम रखा जाएगा पसंद:

__FILE__.scan(/\w+\.\w+$/) 
-5

आप के साथ वर्तमान स्क्रिप्ट के लिए निर्देशिका पथ प्राप्त कर सकते हैं:

File.dirname __FILE__ 
+0

सवाल पथ के बारे में नहीं था, यह ** फ़ाइल नाम ** के बारे में था। "रुबी में फ़ाइल पथ से ** ** फ़ाइल नाम ** कैसे प्राप्त कर सकता हूं?" – fontno

+0

यह होगा: 'File.basename __FILE__' – Samuel

19

Jonathan Lonowski पूरी तरह से उत्तर दिया, लेकिन वहाँ कुछ है कि जवाब में से कोई भी यहाँ उल्लेख किया है। File::extname के बजाय, आप फ़ाइल नाम प्राप्त करने के लिए सीधे '.*' का उपयोग कर सकते हैं।

File.basename("C:\\projects\\blah.dll", ".*") # => "C:\\projects\\blah" 

लेकिन, आप किसी भी विशिष्ट एक्सटेंशन फ़ाइलेंके आधार फ़ाइल नाम प्राप्त करना चाहते हैं, तो आपको File::extname उपयोग करने के लिए, की जरूरत नहीं है अन्यथा।

8

इस कोड

उपयोग extname

File.basename("a/b/d/test.rb", File.extname("a/b/d/test.rb")) #=> "test"