Ruby: Unzipping a file using rubyzip
In the world of Ruby I’ve been working on a script which needs to unzip a file and then run an installer which is only available after unpacking it.
We’ve been using the rubyzip gem to do so but so far it hasn’t felt intuitive to me coming from the Java/C# world.
ZipFile is the class we need to use and at first glance I had thought that it would be possible to just pass the zip file name to the 'extract' method and have it do all the work for me!
Turns out you actually need to open the zip file and then create the directory location for each file in the zip before extracting them all individually.
We eventually ended up with this little method:
require 'rubygems'
require 'zip/zip'
def unzip_file (file, destination)
Zip::ZipFile.open(file) { |zip_file|
zip_file.each { |f|
f_path=File.join(destination, f.name)
FileUtils.mkdir_p(File.dirname(f_path))
zip_file.extract(f, f_path) unless File.exist?(f_path)
}
}
end
Which we can then call with the zip file and the destination where we want to unzip the file.
unzip_file("my.zip", "marks_zip")
Is there a better way to do this? It feels a bit clunky to me at the moment.
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.