Unzipping archive from Ruby (Mac and Windows)
-
@unknownuser said:
I was WRONG about the Mac unzipping as folder.
But I found out that there is an embedded unzip command, which can be invoked via the Ruby system call system.
see main post for detailsI have no clue if this is present on all Macs.
yeah, osx has it's own compressor/expander called Archive Utility.app (located at HD/System/Library/Core Services) which is on all macs (unless for some odd reason, someone decides to delete it).. osx also comes with ruby.
i'd assume that if you can get it working on one mac then it will work on all..
one thing that may cause problems is if the user has changed the default expander to something other than Archive Utility (say Stuffit Expander for instance).. i don't think it would matter but then again, i don't really know.
-
@unknownuser said:
Fredo6: what do you want to do with SCF download ? maybe we can create a backend that suits your needs better thank going through forum software
I wonder - is there many out there at the moment looking at some download/update management system? I've been sketching down ideas for something like this.
Maybe we could brainstorm something together instead of working in solitude on this? -
@thomthom said:
Maybe we could brainstorm something together instead of working in solitude on this?
sure. some public read/invite write access mindmap would be nice. do you know something that we can use for the brainstorm part ?
-
No - I've never used such tools. Would be good to find one.
All I have at the moment are some text document and yellow stickers-notes. -
What about anonymous FTP download ?
Would the user need to manually specify the save path ?
-
What sort of license applies to unzip.exe? I cannot find it anywhere and I'd like to use it for my next plugin.
-
you can use rubyzip gem...
dan did an autoloader outline a couple of posts back...
[anchor= goto=http://sketchucation.com/forums/viewtopic.php?f=180&t=59990&start=30#p548017:3q0rxtjb]should be here[/anchor:3q0rxtjb]
john -
@eneroth3 said:
What sort of license applies to unzip.exe? I cannot find it anywhere and I'd like to use it for my next plugin.
Unless you need support for SketchUp older than SU2014 I'd go with the zip gem that john mentions.
-
Thanks! The gem rubyzip gem does exactly what I wanted .
However I don't know what's the best practice to use a gem. Should I ask the user to install it or should I check if it exists when the plugin loads and otherwise install it? Should I in that case use statusbar texts to tell the user the gem is being installed and that it may take some time?
-
It only instals into Sketchup gems, so if they want your plugin they will need it...
If it not already installed:
I guess you could ask if they want the download or to use 'your' supplied copy, but you would need to keep 'yours' up to date as other plugins use it already...it's very fast to load, did you try?
Definitely mention it in your documentation...
john
-
There are 'built-in' zip and unzip methods in Ruby2 - using 'zlib', with no gems.
See my ZipUp Plugin which uses its own shipped rubies to make things easier [Rubyzip].
https://github.com/rubyzip/rubyzip
Mine also uses some js and system zipping [MAC is easy, but on WIN is convoluted] when it's older SketchUp versions, < Ruby2...
It's in an RBS, but suffice it to say that it uses the additional zip.rb loaded commands to make the Ruby2 'zlib' code much less cumbersome to use... -
It took me 69,12 seconds to install the gem :S . I think I have a quite good Internet connection, at least a decent one, but it might be my dying hard drive.
I still suppose it's better to download the most current version than rely on something I pack with the plugin. If I pack it with my files I suppose it has to be in my own namespace to avoid collisions if another plugin requires a newer version.
Perhaps there should be a web dialog telling the user the gem is being installed so they know Sketchup hasn't just frozen.
-
it really depends on what your zipping/unzipping...
for mac the system zip and unzip are the cleanest and fastest...
I use it on .skm's and .layout's mainly.
for .rbz I useSketchup.install_from_archive
and let SU move the files... -
TIG: I experimented a little with Zlib before but I couldn't find a way to save multiple files in the same archive which I need for my plugin, it doesn't seem to be supported.
-
Mine only loads zlib.so and requires the ruby zip.rb stuff if it's not already been installed.
So if another plugin already installed it it uses that.
You can of course so it entirely in vbs/mac-shell for all versions....
These are all inside begin/rescue/ensure sections...
` require('zlib') unless defined?(Zlib)in case it is already loaded, and in case it fails it's in a 'rescue'`
To allow my
require('zip')
to work I briefly add the path to the plugins own subfolder into$:
thus:
` ...
rubyzip=File.join(DATA, 'Rubyzip')where DATA is a constant referring to that plugin's subfolder named 'Rubyzip'
$: << rubyzip
...
require('zip') unless defined?(Zip)in case not already installed by another plugin...
...
$:.delete(rubyzip)to tidy up, ad it's no longer needed...
...`
The Rubyzip methods allow you to add multiple files into a ZIP file - in fact you can do most ZIP/unZIP things with it in conjunction with zlib...
-
Using Rubyzip...
zipped = Zip;;File.open(zip, Zip;;File;;CREATE) do |zipfile| # - The name of the file as it will appear in the archive # - The original file, including the path to find it zipfile.add(skp, tempskp) zipfile.add(txt, temptxt) end
This opens a ZIP file, whose full-path ref is 'zip' [in this case a new one].
It then adds a file to that ZIP, whose full-path ref is in 'tempskp', and which will appear in the ZIP as the reference 'skp' - in this case it's the SKP's name...
It then adds another file to the ZIP, whose full-path ref is in 'temptxt', and which will appear in the ZIP as the reference 'txt' - in this case it's the TXT file's name...
You can also add subfolders etc as desired - read the Rubyzip usage notes...You don't need to install the 'gem' for the users - just look how I am pre-including them in ../PluginsZipUp/Data/Rubyzip ... with the RBZ installer...
-
@tig
how do you 'test' a zipped folder with Rubyzip?for example with unzip you have the -t flag...
def is_texture(file) %x( unzip -t "#{file}" ).include? "ref\/.*g" # file = path to skm and ref/ means it has a texture folder end
-
Yours is the simple MAC way !
You can find/read the contents of an existing ZIP for a match in this kind of example...Zip;;File.open(path_to_some_foo_zip') do |zip_file| # Handle entries one by one zip_file.each do |entry| # Extract to file/directory/symlink puts "Extracting #{entry.name}" entry.extract(dest_file) # Read into memory content = entry.get_input_stream.read end # Find specific entry entry = zip_file.glob('*.csv').first puts entry.get_input_stream.read end
You need to set up your reference variables...
-
These examples use rubyzip but from a subdirectory rather than a Gem. Is it possible to only use the Zlib without rubyzip to put multiple files in the same zip archive?
I use these archives to store information for what can be drawn with my plugin. In my previous plugin I stored railroad tracks in a similar way but in their own folders instead of archives. Each folder contained a few .skp models for things to draw when drawing the track, e.g profiles, a preview image for web dialogs and a text file containing some information dynamically displayed in the web dialogs without loading the models and littering the definition list.
In this project I want to store all that data in one single file to make it easier for users to exchange them. I've already managed to do that but I don't know what's considered best practice, installing a Gem or copy the code into my own plugin's folder.
-
have you tried this...
system( 'ROBOCOPY', files_directory, new_zip_folder_path )
if it works [I don't have a PC to test], The mac version is almost the same...
system('zip', '-r', new_zip_folder_path, files_directory)
john
Advertisement