使用以下测试树文件夹,例如:
- test1
- folder2
- test1 # This is the file rubyzip will break on.
- test2
从here复制此代码:
path = File.expand_path path
archive = File.join(__dir__, File.basename(path)) + '.zip'
FileUtils.rm archive, force: true
Zip::File.open(archive, Zip::File::CREATE) do | zipfile |
Dir["#{path}/**/**"].reject{|f|f==archive}.each do | item |
basename = File.basename(item)
zipfile.add(basename, item)
end
end
它失败了,因为有两个文件具有相同的名称,即使它们不在同一目录中(在我的示例中为test1
)。
我有什么遗失的吗?
答案 0 :(得分:0)
感谢@simonoff(here),我不应该使用基本名称而是使用完整的相对路径,因此Rubyzip可以区分test1
和folder2/test1
。
以下是修复它的代码:
basename = File.basename path
dirname = File.dirname path
internal_path = path.sub %r[^#{__dir__}/], ''
archive = File.join(dirname, basename) + '.zip'
FileUtils.rm archive, force: true
Zip::File.open(archive, Zip::File::CREATE) do | zipfile |
Dir["#{internal_path}/**/**"].map{|e|e.sub %r[^#{internal_path}/],''}.reject{|f|f==archive}.each do | item |
zipfile.add(item, File.join(internal_path, item))
end
end
当然有更清洁的方法。