असल में मैं मेमोरी से डेटा को एक टैर/जीजे प्रारूप (संभवतः टैर में कई फाइलों में स्ट्रीम करना चाहता हूं, लेकिन इसे कभी भी हार्डड्राइव नहीं करना चाहिए, केवल स्ट्रीमिंग करना चाहिए!), फिर उन्हें कहीं और स्ट्रीम करें (एक मेरे मामले में HTTP अनुरोध निकाय)।रूबी स्ट्रीमिंग tar/gz
कोई भी मौजूदा पुस्तकालय के बारे में जानता है जो यह कर सकता है? क्या रेल में कुछ है?
libarchive-ruby केवल एक सी रैपर है और ऐसा लगता है कि यह बहुत मंच-निर्भर होगा (दस्तावेज़ चाहते हैं कि आप एक इंस्टॉलेशन चरण के रूप में संकलित करें ?!)।
समाधान:
require 'zlib'
require 'rubygems/package'
tar = StringIO.new
Gem::Package::TarWriter.new(tar) { |writer|
writer.add_file("a_file.txt", 0644) { |f|
(1..1000).each { |i|
f.write("some text\n")
}
}
writer.add_file("another_file.txt", 0644) { |f|
f.write("some more text\n")
}
}
tar.seek(0)
gz = Zlib::GzipWriter.new(File.new('this_is_a_tar_gz.tar.gz', 'wb')) # Make sure you use 'wb' for binary write!
gz.write(tar.read)
tar.close
gz.close
यह है कि! स्ट्रीमिंग को रखने के लिए आप किसी भी IO के साथ GzipWriter में फ़ाइल को स्वैप कर सकते हैं। Dw11wtq के लिए कुकीज़!
मुझे यह भी इंगित करना चाहिए कि यह वास्तव में स्मृति गहन है - यह gzip स्ट्रीम पर जाने से पहले स्ट्रिंगियो को पूरे टैर से भर देगा। बड़ी फ़ाइलों के लिए एक बेहतर समाधान धाराओं के बीच एक बफर बनाना होगा। जब मैं इसे कार्यान्वित करने के लिए चारों ओर जाता हूं तो मैं इसके लिए कोड जोड़ूंगा ... –
यह भी ध्यान दें कि gz.close आउटपुट IO (इस मामले में फ़ाइल) को भी बंद कर देगा। इसे खोलने के लिए, gz.finish –