我有一個.zip壓縮包含幾個目錄。使用rubyzip gem,我希望進入.zip壓縮文件,複製指定的目錄(及其內容)並將目錄移動到第二個.zip壓縮文件中。如何使用rubyzip將zip檔案內的目錄複製到第二個zip檔案中?
理想情況下,我不必提取第一個.zip壓縮文件的內容,然後將它們重新壓縮到第二個壓縮文件中。我希望有一種方法可以使用rubyzip gem中提供的方法。
我有一個.zip壓縮包含幾個目錄。使用rubyzip gem,我希望進入.zip壓縮文件,複製指定的目錄(及其內容)並將目錄移動到第二個.zip壓縮文件中。如何使用rubyzip將zip檔案內的目錄複製到第二個zip檔案中?
理想情況下,我不必提取第一個.zip壓縮文件的內容,然後將它們重新壓縮到第二個壓縮文件中。我希望有一種方法可以使用rubyzip gem中提供的方法。
在與一位rubyzip寶石的維護人員覈對之後,我瞭解到這是不可能的。
這是一種暴力破解方法(可能或可能不適用於您的應用程序),但您可以複製整個第一個zip文件,然後使用rubyzip方法從複製的文件中刪除除目標目錄以外的所有內容。
理論上講,如果您使用放氣壓縮(將每個文件存儲爲單獨壓縮的項目),您應該可以這麼做。
其實我試過你提到的蠻力方法,但.zip文件的內容是如此之大,我必須做好幾份 - 結果太慢了。 – rswolff
在問題中添加更多信息會有幫助:您在操作系統上使用什麼操作系統?拉鍊的大小?將文件存儲在zip中的原因。 –
RubyZip庫必須自此更新以支持它。這對我有效。
require 'rubygems'
require 'zip' # gem 'rubyzip', '>= 1.0'
Zip::File.open('large.zip', false) do |input|
Zip::File.open('small.zip', true) do |output|
input.glob('my_folder_name/*') do |entry|
entry.get_input_stream do |input_entry_stream|
output.get_output_stream(entry.name) do |output_entry_stream|
# you could also chunk this, rather than reading it all at once.
output_entry_stream.write(input_entry_stream.read)
end
end
end
end
end
對於RubyZip < 1.0版本,而不是require 'zip/zip'
,並使用Zip::ZipFile
代替Zip::File
感謝您的回答。我只是尋找這個代碼 - 它對我來說工作得很好。 – knut
謝謝!我已將您的貢獻整合到答案中。 –
請檢查[約翰答案](http://stackoverflow.com/a/11077181/676874)。我剛剛測試成功。 – knut