2013-12-20 60 views
1

歡呼聲, 作爲一個初學ruby,我目前正在用紅寶石解決我的小世界問題,以適應它。現在我試圖修改一個zip容器中的文本文件的內容。Zip :: ZipFile:如何修改內部文本文件的內容而無需解壓zip?

結構

ZIP 
    >> diretory/ 
    >> mytext.text 

,我能夠遍歷內容

Zip::ZipFile.open(file_path) do |zipfile| 
    files = zipfile.select(&:file?) 
    files.each do |zip_entry| 
    ## ....? 
    end 
end 

...但我覺得很難修改的文本文件,而不拆包。

任何幫助表示讚賞!

回答

2

因此,與奔的幫助下,這裏有一個解決方案:

require "rubygems" 
require "zip/zip" 
zip_file_name = "src/test.zip" 

Zip::ZipFile.open(zip_file_name) do |zipfile| 
    files = zipfile.select(&:file?) 
    files.each do |zip_entry| 
    contents = zipfile.read(zip_entry.name) 
    zipfile.get_output_stream(zip_entry.name){ |f| f.puts contents + ' added some text' } 
    end 
    zipfile.commit 
end 

不過,我覺得我已經嘗試過這一點 - 反正。非常感謝!

1

這個剪輯位在myFile.txt的末尾添加了「添加了一些文本」。

Zip::File.open(file_path) do |zipfile| 
    contents = zipfile.read('myFile.txt') 
    zipfile.get_output_stream('myFile.txt') { |f| f.puts contents + ' added some text' } 
end 

出於某種原因,該修改的zip文件如果寫(調用get_output_stream),而使用 each遍歷歸檔的文件做不會被保存。

編輯:要通過遍歷它們來修改文件,請用Zip :: ZipFile.open打開存檔(請參閱Chris的示例回答)。

希望這一點能幫助你指出正確的方向。

+0

嘿,這差不多是「它」...我知道我必須從http://rubyzip.sourceforge.net/classes/Zip/ZipFile.html –

+0

「zipfile.commit」有趣...從我的實驗在帶有Ruby 1.9.2的Windows系統上,zipfile.commit對於我們的任何答案都不是必需的。你正在運行哪個操作系統和Ruby版本? –

+0

嗯,我還沒有證實這是不工作沒有'承諾'。我一直在Windows 7中嘗試這個,現在我的Mac上已經有了The Solution pm。 –