/ / रिकर्सिव पैटर्न फ़ाइल रूबी / रेक में हटाएं - रूबी, रिकर्सन, रेक

रूबी / रेक में रिकर्सिव पैटर्न फ़ाइल हटाएं - रूबी, रिकर्सन, रेक

मैं एक के आधार पर फ़ाइलों को हटाने का प्रयास कर रहा हूँकिसी दिए गए पथ में निहित सभी निर्देशिकाओं का पैटर्न। मेरे पास निम्नलिखित है लेकिन यह अनंत लूप की तरह कार्य करता है। जब मैं लूप से रद्द करता हूं, तो कोई भी फाइल हटाई नहीं जाती है। मुझसे कहां गलती हो रही है?

def recursive_delete (dirPath, pattern)
if (defined? dirPath and  defined? pattern && File.exists?(dirPath))
stack = [dirPath]

while !stack.empty?
current = stack.delete_at(0)
Dir.foreach(current) do |file|
if File.directory?(file)
stack << current+file
else
File.delete(dirPath + file) if (pattern).match(file)
end
end
end

end
end

# to call:
recursive_delete("c:Test_Directory", /^*.cs$/)

उत्तर:

उत्तर № 1 के लिए 33

आपको इस पहिया को फिर से कार्यान्वित करने की आवश्यकता नहीं है। रिकर्सिव फ़ाइल ग्लोब कोर लाइब्रेरी का हिस्सा पहले से ही है।

Dir.glob("C:Test_Directory***.cs").each { |f| File.delete(f) }

डिर # ग्लोब निर्देशिका में फ़ाइलों को सूचीबद्ध करता है और वाइल्डकार्ड स्वीकार कर सकता है। ** एक सुपर-वाइल्डकार्ड है जिसका अर्थ है "कुछ भी मिलान करें, जिसमें निर्देशिकाओं के पूरे पेड़ शामिल हैं", इसलिए यह किसी भी स्तर से गहराई से मेल खाएगा (जिसमें "नहीं" स्तर गहराई शामिल है: .cs में फाइलें C:Test_Directory मैं आपूर्ति किए गए पैटर्न का उपयोग करके भी मेल खाता हूं)।

@kkurian बताते हैं (टिप्पणियों में) कि File#delete एक सूची स्वीकार कर सकते हैं, इसलिए इसे सरल बनाया जा सकता है:

File.delete(*Dir.glob("C:Test_Directory***.cs"))

जवाब के लिए 12 № 2

चूंकि आप पहले से ही रेक का उपयोग कर रहे हैं, आप सुविधाजनक का उपयोग कर सकते हैं FileList वस्तु। उदाहरण के लिए:

require "rubygems"
require "rake"

FileList["c:/Test_Directory/**/*.cs"].each {|x| File.delete(x)}

जवाब के लिए 11 № 3

एक निर्देशिका के तहत फ़ाइलों को रिकर्सिव करने के लिए FileUtils का उपयोग कर एक और रूबी एक लाइनर शॉर्टकट

FileUtils.rm Dir.glob("c:/temp/**/*.so")

यहां तक ​​कि छोटा:

FileUtils.rm Dir["c:/temp/**/*.so"]

एक और जटिल उपयोग: एकाधिक पैटर्न (विभिन्न निर्देशिका में एकाधिक विस्तार)। चेतावनी आप Dir.glob () का उपयोग नहीं कर सकते

FileUtils.rm Dir["c:/temp/**/*.so","c:/temp1/**/*.txt","d:/temp2/**/*.so"]