OS: MacOS 10.6.3
Ruby: ruby 1.9.2dev (2010-05-30 revision 28085) [x86_64-darwin10.3.0]
Zip: rubyzip and rubyzip2
I can't create zip archive for files that has russian symbols in name. Example:
Zip::ZipFile.open("Photo079.jpg.zip", Zip::ZipFile::CREATE) do |zipfile|
zipfile.add("Фото079.jpg","Фото079.jpg")
end
This code create broken archive Photo079.jpg.zip:
zipinfo Photo079.jpg.zip
Archive: Photo079.jpg.zip 430629 1
warning [Photo079.jpg.zip]: 4 extra bytes at beginning or within zipfile
(attempting to process anyway)
error [Photo079.jpg.zip]: reported length of central directory is
-4 bytes too long (Atari STZip zipfile? J.H.Holm ZIPSPLIT 1.1
zipfile?). Compensating...
-rw-r--r-- 5.2 unx 431106 t- defN 31-May-10 08:14 Фото079
1 file, 431106 bytes uncompressed, 430505 bytes compressed: 0.1%
note: didn't find end-of-central-dir signature at end of central dir.
If change file name in archive from "Фото079.jpg" to "Photo079.jpg" :
Zip::ZipFile.open("Photo079.jpg.zip", Zip::ZipFile::CREATE) do |zipfile|
zipfile.add("Photo079.jpg","Фото079.jpg")
end
Archive will be created properly.
For compressing directory I using following code:
def create_zip_archive(dirname)
require 'zip/zip'
FileUtils.rm_rf("#{dirname}.zip")
Zip::ZipFile.open("#{dirname}.zip", Zip::ZipFile::CREATE) do |zipfile|
Dir["#{dirname}/*"].each do |file|
zipfile.add(file.sub("#{dirname}/",''),file)
end
end
end
It works only for directories that hasn't files with russian names. Otherwise I get following error:
TypeError: can't dup NilClass
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1163:in dup'
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1163:in
block in dup'
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1163:in map'
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1163:in
dup'
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1399:in initialize'
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1520:in
commit'
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1525:in close'
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip-0.9.4/lib/zip/zip.rb:1415:in
open'
from (irb):4:in create_zip_archive'
from (irb):11 from /Users/ablyamyt/.rvm/rubies/ruby-1.9.2-head/bin/irb:17:in
<main>'
Anonymous
I tried also rubyzip2 library, but got the same error:
TypeError: can't dup NilClass
from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1131:in
dup' from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1131:in
block in dup'from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1131:in
map' from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1131:in
dup'from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1367:in
initialize' from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1486:in
commit'from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1491:in
close' from /Users/ablyamyt/.rvm/gems/ruby-1.9.2-head/gems/rubyzip2-2.0.1/lib/zip/zip.rb:1383:in
open'from (irb):4:in
create_zip_archive' from (irb):11 from /Users/ablyamyt/.rvm/rubies/ruby-1.9.2-head/bin/irb:17:in
<main>'