2011-03-28 62 views
0

我試圖刪除zip文件中的非空文件夾。 我在Ubuntu 10.10中使用ruby 1.8.7。我試圖rubyzip寶石和寶石zip如何使用Ruby gem'zip'或'rubyzip'刪除zip文件中的非空文件夾?

require 'zip/zipfilesystem' 
Zip::ZipFile.open('apkfile.apk') { |zfile| zfile.dir.delete('META-INF') } 

它報告以下錯誤

變量Errno :: ENOENT:沒有這樣的文件或目錄

現在我只能刪除該目錄下的每個條目最後刪除目錄中的最後一個文件後,該目錄將被刪除。

require 'zip/zipfilesystem' 
Zip::ZipFile.open('apkfile.apk') do |zfile| 
    zfile.file.delete("META-INF/foo1.bar") 
    zfile.file.delete("META-INF/foo2.bar") 
    zfile.file.delete("META-INF/foo3.bar") 
end 

是否有可能使用FileUtils.rm_rf方法fileutils中的寶石在zip文件?

回答

1

應該

Zip::ZipFile.open('foo.zip') { |zfile| zfile.remove('bar') } 

http://rubyzip.sourceforge.net/classes/Zip/ZipFile.html#M000150

+0

嗨,謝謝你的回覆。我也試過這個。提示相同的錯誤。 – Xiao 2011-03-28 07:51:51

+0

奇怪的是,它適合我。原諒這個愚蠢的問題,但是你確定你的zip裏有一個名爲'bar'的目錄嗎? – 2011-03-28 08:05:48

+0

我已經更新了這個問題。希望更清楚 – Xiao 2011-03-28 10:34:50

0

我有點吃驚地發現,rubyzip不會做這個,的事實,更有前途的zipruby還具有刪除文件的沒有明顯的方式混淆所有。

試圖實現我自己的遞歸刪除似乎有一些嚴重破壞了rubyzip的實現;它在內部存儲一個@entries對象,其中的其他代碼(最明顯是Zip::ZipFileSystem::ZipFsDir)預計會找到:directory類型的節點,但沒有其他代碼,因此它會引發未找到的異常。我會盡力併發布錯誤報告。

無論如何,下面的黑客將允許你使用rubyzip從zip文件中刪除一個目錄。請注意,通過以這種方式清空目錄會消失,如果您只想清空它,則可能需要使用ZipFsDirmkdir將其添加回來。

class Zip::ZipFile 
    def rm_rf(dir) 
    dir_entries = self.entries.select { |e| Regexp.new("^#{File.join(dir, '/')}.*") === e.name } 
    dir_entries.each { |e| self.remove(e) } 
    dir_entries 
    end 
end 

然後使用:

Zip::ZipFile.open(path) do |a| 
    a.rm_rf('directory-name') 
end 

刪除目錄。

相關問題