seven_zip_ruby 1.0.0-x86-mswin32-100
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +25 -0
- data/.travis.yml +10 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +39 -0
- data/README.md +176 -0
- data/Rakefile +47 -0
- data/lib/seven_zip_ruby.rb +16 -0
- data/lib/seven_zip_ruby/7z.dll +0 -0
- data/lib/seven_zip_ruby/7z64.dll +0 -0
- data/lib/seven_zip_ruby/archive_info.rb +21 -0
- data/lib/seven_zip_ruby/entry_info.rb +45 -0
- data/lib/seven_zip_ruby/exception.rb +7 -0
- data/lib/seven_zip_ruby/seven_zip_archive.so +0 -0
- data/lib/seven_zip_ruby/seven_zip_reader.rb +180 -0
- data/lib/seven_zip_ruby/seven_zip_writer.rb +143 -0
- data/lib/seven_zip_ruby/update_info.rb +116 -0
- data/lib/seven_zip_ruby/version.rb +3 -0
- data/seven_zip_ruby.gemspec +28 -0
- data/spec/seven_zip_ruby_spec.rb +490 -0
- data/spec/seven_zip_ruby_spec_helper.rb +122 -0
- metadata +109 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a1ed3863363342f20c6675cb625106b5dcfe5b2b
|
4
|
+
data.tar.gz: 2ceccd132fe247396b6c2dd388fae13216bb2bd3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c2f79df823d2cb16e614b7f648587ae87967b984c4057ee7bea81a4a1caff8cb7528ad1987f8692e264791f8101985c2e144f55bf0a49a667ab9e5b9ed1bc729
|
7
|
+
data.tar.gz: 50e137db48f4c536abbbdbc8c43407594ecc60e713376dd194fd9a54fde5be627bc4bc571006d102db95dfcebd1951a4b0611b864f7a3f6ebf6c8f04fed2f61a
|
data/.gitignore
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
*.rbc
|
2
|
+
*.o
|
3
|
+
*.so
|
4
|
+
*.bundle
|
5
|
+
*.bak
|
6
|
+
mkmf.log
|
7
|
+
.bundle
|
8
|
+
.config
|
9
|
+
.yardoc
|
10
|
+
Gemfile.lock
|
11
|
+
InstalledFiles
|
12
|
+
_yardoc
|
13
|
+
coverage
|
14
|
+
doc/
|
15
|
+
lib/bundler/man
|
16
|
+
rdoc
|
17
|
+
spec/reports
|
18
|
+
test/tmp
|
19
|
+
test/version_tmp
|
20
|
+
tmp
|
21
|
+
XTAGS
|
22
|
+
ext/seven_zip_ruby/Makefile
|
23
|
+
ext/seven_zip_ruby/*.def
|
24
|
+
ext/seven_zip_ruby/*.pdb
|
25
|
+
ext/p7zip/makefile.machine
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Copyright (c) 2013 Masamitsu MURASE
|
2
|
+
|
3
|
+
SevenZipRuby
|
4
|
+
|
5
|
+
The GNU LGPL + unRAR restriction means that you must follow both
|
6
|
+
GNU LGPL rules and unRAR restriction rules.
|
7
|
+
|
8
|
+
GNU LGPL information
|
9
|
+
--------------------
|
10
|
+
|
11
|
+
This library is free software; you can redistribute it and/or
|
12
|
+
modify it under the terms of the GNU Lesser General Public
|
13
|
+
License as published by the Free Software Foundation; either
|
14
|
+
version 2.1 of the License, or (at your option) any later version.
|
15
|
+
|
16
|
+
This library is distributed in the hope that it will be useful,
|
17
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
19
|
+
Lesser General Public License for more details.
|
20
|
+
|
21
|
+
You can receive a copy of the GNU Lesser General Public License from
|
22
|
+
http://www.gnu.org/
|
23
|
+
|
24
|
+
|
25
|
+
unRAR restriction
|
26
|
+
-----------------
|
27
|
+
|
28
|
+
The decompression engine for RAR archives was developed using source
|
29
|
+
code of unRAR program.
|
30
|
+
All copyrights to original unRAR code are owned by Alexander Roshal.
|
31
|
+
|
32
|
+
The license for original unRAR code has the following restriction:
|
33
|
+
|
34
|
+
The unRAR sources cannot be used to re-create the RAR compression algorithm,
|
35
|
+
which is proprietary. Distribution of modified unRAR sources in separate form
|
36
|
+
or as a part of other software is permitted, provided that it is clearly
|
37
|
+
stated in the documentation and source comments that the code may
|
38
|
+
not be used to develop a RAR (WinRAR) compatible archiver.
|
39
|
+
|
data/README.md
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
# SevenZipRuby ![Logo](https://raw.github.com/masamitsu-murase/seven_zip_ruby/master/resources/seven_zip_ruby_logo.png)
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/masamitsu-murase/seven_zip_ruby.png?branch=master)](https://travis-ci.org/masamitsu-murase/seven_zip_ruby)
|
4
|
+
|
5
|
+
This is a Ruby gem library to handle [7-Zip](http://www.7-zip.org) archives.
|
6
|
+
|
7
|
+
This extension calls the native library, 7z.dll or 7z.so, internally and it is included in this gem.
|
8
|
+
|
9
|
+
## Features
|
10
|
+
* Use official DLL, 7z.dll, internally.
|
11
|
+
* Support extracting data into memory.
|
12
|
+
|
13
|
+
## Examples
|
14
|
+
|
15
|
+
**This is a beta version.**
|
16
|
+
The interfaces may be changed.
|
17
|
+
|
18
|
+
If you have any comments about interface API, let me know please.
|
19
|
+
|
20
|
+
### Extract archive
|
21
|
+
```ruby
|
22
|
+
File.open("filename.7z", "rb") do |file|
|
23
|
+
SevenZipRuby::Reader.open(file) do |szr|
|
24
|
+
szr.extract_all "path_to_dir"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
29
|
+
You can also use handy method.
|
30
|
+
```ruby
|
31
|
+
File.open("filename.7z", "rb") do |file|
|
32
|
+
SevenZipRuby::Reader.extract_all(file, "path_to_dir")
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
### Show entries in archive
|
37
|
+
```ruby
|
38
|
+
File.open("filename.7z", "rb") do |file|
|
39
|
+
SevenZipRuby::Reader.open(file) do |szr|
|
40
|
+
list = szr.entries
|
41
|
+
p list
|
42
|
+
# => [ "#<EntryInfo: 0, dir, dir/subdir>", "#<EntryInfo: 1, file, dir/file.txt>", ... ]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
### Extract encrypted archive
|
48
|
+
```ruby
|
49
|
+
File.open("filename.7z", "rb") do |file|
|
50
|
+
SevenZipRuby::Reader.open(file, { password: "Password String" }) do |szr|
|
51
|
+
szr.extract_all "path_to_dir"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
```
|
55
|
+
or
|
56
|
+
```ruby
|
57
|
+
File.open("filename.7z", "rb") do |file|
|
58
|
+
SevenZipRuby::Reader.extract_all(file, "path_to_dir", { password: "Password String" })
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
|
63
|
+
### Verify archive
|
64
|
+
```ruby
|
65
|
+
File.open("filename.7z", "rb") do |file|
|
66
|
+
SevenZipRuby::Reader.verify(file)
|
67
|
+
# => true/false
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
### Compress files
|
72
|
+
```ruby
|
73
|
+
File.open("filename.7z", "wb") do |file|
|
74
|
+
SevenZipRuby::Writer.open(file) do |szr|
|
75
|
+
szr.add_directory("dir")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
```
|
79
|
+
or
|
80
|
+
```ruby
|
81
|
+
File.open("filename.7z", "wb") do |file|
|
82
|
+
SevenZipRuby::Writer.add_directory(file, "dir")
|
83
|
+
end
|
84
|
+
```
|
85
|
+
|
86
|
+
## Supported platforms
|
87
|
+
|
88
|
+
* Windows
|
89
|
+
* Linux
|
90
|
+
* Mac OSX
|
91
|
+
|
92
|
+
## More examples
|
93
|
+
|
94
|
+
### Extract partially
|
95
|
+
|
96
|
+
Extract files whose size is less than 1024.
|
97
|
+
|
98
|
+
```ruby
|
99
|
+
File.open("filename.7z", "rb") do |file|
|
100
|
+
SevenZipRuby::Reader.open(file) do |szr|
|
101
|
+
small_files = szr.entries.select{ |i| i.file? && i.size < 1024 }
|
102
|
+
szr.extract(small_files, "path_to_dir")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
### Get data from archive
|
108
|
+
|
109
|
+
Extract data into memory.
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
data = nil
|
113
|
+
File.open("filename.7z", "rb") do |file|
|
114
|
+
SevenZipRuby::Reader.open(file) do |szr|
|
115
|
+
smallest_file = szr.entries.select(&:file?).min_by(&:size)
|
116
|
+
data = szr.extract_data(smallest_file)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
p data
|
120
|
+
# => File content is shown.
|
121
|
+
|
122
|
+
### Create archive manually
|
123
|
+
|
124
|
+
```
|
125
|
+
File.open("filename.7z", "rb") do |file|
|
126
|
+
SevenZipRuby::Writer.open(file) do |szr|
|
127
|
+
szr.add_file "entry1.txt"
|
128
|
+
szr.mkdir "dir1"
|
129
|
+
szr.mkdir "dir2"
|
130
|
+
|
131
|
+
data = [0, 1, 2, 3, 4].pack("C*")
|
132
|
+
szr.add_data data, "entry2.txt"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
```
|
136
|
+
|
137
|
+
### Set compression mode
|
138
|
+
|
139
|
+
7zip supports LZMA, LZMA2, PPMD, BZIP2, DEFLATE and COPY.
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
# random data
|
143
|
+
data = 50000000.to_enum(:times).map{ rand(256) }.pack("C*")
|
144
|
+
|
145
|
+
a = StringIO.new("")
|
146
|
+
start = Time.now
|
147
|
+
SevenZipRuby::Writer.open(a) do |szr|
|
148
|
+
szr.method = "BZIP2" # Set compression method to "BZIP2"
|
149
|
+
szr.multi_thread = false # Disable multi-threading mode
|
150
|
+
szr.add_data(data, "test.bin")
|
151
|
+
end
|
152
|
+
p(Time.now - start)
|
153
|
+
# => 11.180934
|
154
|
+
|
155
|
+
a = StringIO.new("")
|
156
|
+
start = Time.now
|
157
|
+
SevenZipRuby::Writer.open(a) do |szr|
|
158
|
+
szr.method = "BZIP2" # Set compression method to "BZIP2"
|
159
|
+
szr.multi_thread = true # Enable multi-threading mode (default)
|
160
|
+
szr.add_data(data, "test.bin")
|
161
|
+
end
|
162
|
+
p(Time.now - start)
|
163
|
+
# => 3.607563 # Faster than single-threaded compression.
|
164
|
+
```
|
165
|
+
|
166
|
+
|
167
|
+
## TODO
|
168
|
+
|
169
|
+
* Support file attributes on Linux and Mac OSX.
|
170
|
+
* Support updating archive.
|
171
|
+
* Support extracting rar archive.
|
172
|
+
|
173
|
+
|
174
|
+
## License
|
175
|
+
LGPL and unRAR license. Please refer to LICENSE.txt.
|
176
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
|
4
|
+
BINARY_FILES = [ "seven_zip_archive.so", "seven_zip_archive.bundle" ]
|
5
|
+
MAKE = (ENV["MAKE"] || ENV["make"] || (RUBY_PLATFORM.include?("mswin") ? "nmake" : "make"))
|
6
|
+
|
7
|
+
task :build_platform => [ :pre_platform, :build, :post_platform ]
|
8
|
+
|
9
|
+
task :pre_platform do
|
10
|
+
FileUtils.mv("seven_zip_ruby.gemspec", "seven_zip_ruby.gemspec.bak")
|
11
|
+
FileUtils.cp("resources/seven_zip_ruby.gemspec.platform", "seven_zip_ruby.gemspec")
|
12
|
+
end
|
13
|
+
|
14
|
+
task :post_platform do
|
15
|
+
FileUtils.mv("seven_zip_ruby.gemspec.bak", "seven_zip_ruby.gemspec")
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
task :build_local_all => [ :build_local_clean, :build_local ]
|
20
|
+
task :build_local => [ :build_binary, :copy_binary ]
|
21
|
+
|
22
|
+
task :build_local_clean do
|
23
|
+
Dir.chdir "ext/seven_zip_ruby" do
|
24
|
+
sh("#{MAKE} clean") if (File.exist?("Makefile"))
|
25
|
+
end
|
26
|
+
|
27
|
+
[ "ext/seven_zip_ruby", "lib/seven_zip_ruby" ].each do |dir|
|
28
|
+
FileUtils.rmtree(BINARY_FILES.map{ |i| "#{dir}/#{i}" })
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
task :build_binary do
|
33
|
+
Dir.chdir "ext/seven_zip_ruby" do
|
34
|
+
FileUtils.rmtree BINARY_FILES
|
35
|
+
sh "ruby extconf.rb"
|
36
|
+
sh "#{MAKE}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task :copy_binary do
|
41
|
+
BINARY_FILES.each do |file|
|
42
|
+
src = File.join("ext", "seven_zip_ruby", file)
|
43
|
+
dest = File.join("lib", "seven_zip_ruby", file)
|
44
|
+
FileUtils.rmtree(dest) if (File.exist?(dest))
|
45
|
+
FileUtils.cp(src, dest) if (File.exist?(src))
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require_relative("seven_zip_ruby/version")
|
4
|
+
|
5
|
+
Dir.chdir("#{__dir__}/seven_zip_ruby"){ require_relative("seven_zip_ruby/seven_zip_archive") }
|
6
|
+
raise "Failed to initialize SevenZipRuby" unless (defined?(SevenZipRuby::SevenZipReader))
|
7
|
+
|
8
|
+
require_relative("seven_zip_ruby/seven_zip_reader")
|
9
|
+
require_relative("seven_zip_ruby/seven_zip_writer")
|
10
|
+
require_relative("seven_zip_ruby/archive_info")
|
11
|
+
require_relative("seven_zip_ruby/update_info")
|
12
|
+
require_relative("seven_zip_ruby/entry_info")
|
13
|
+
require_relative("seven_zip_ruby/exception")
|
14
|
+
|
15
|
+
module SevenZipRuby
|
16
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module SevenZipRuby
|
2
|
+
class ArchiveInfo
|
3
|
+
def initialize(method, solid, num_blocks, header_size, phy_size)
|
4
|
+
@method, @solid, @num_blocks, @header_size, @phy_size =
|
5
|
+
method, solid, num_blocks, header_size, phy_size
|
6
|
+
end
|
7
|
+
|
8
|
+
attr_reader :method, :num_blocks, :header_size, :phy_size
|
9
|
+
|
10
|
+
alias size phy_size
|
11
|
+
alias block_num num_blocks
|
12
|
+
|
13
|
+
def solid?
|
14
|
+
return @solid
|
15
|
+
end
|
16
|
+
|
17
|
+
def inspect
|
18
|
+
"#<ArchiveInfo: #{method}, #{size}byte>"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require("pathname")
|
2
|
+
|
3
|
+
module SevenZipRuby
|
4
|
+
class EntryInfo
|
5
|
+
def initialize(index, path, method, dir, encrypted, anti, size, pack_size, ctime, atime, mtime, attrib, crc)
|
6
|
+
@index, @path, @method, @dir, @encrypted, @anti, @size, @pack_size, @ctime, @atime, @mtime, @attrib, @crc =
|
7
|
+
index, Pathname(path.to_s.force_encoding(Encoding::UTF_8)).cleanpath, method, dir, encrypted, anti, size, pack_size, ctime, atime, mtime, attrib, crc
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_reader :index, :path, :method, :size, :pack_size, :ctime, :atime, :mtime, :attrib, :crc
|
11
|
+
alias to_i index
|
12
|
+
|
13
|
+
def directory?
|
14
|
+
return @dir
|
15
|
+
end
|
16
|
+
|
17
|
+
def file?
|
18
|
+
return !(@dir)
|
19
|
+
end
|
20
|
+
|
21
|
+
def encrypted?
|
22
|
+
return @encrypted
|
23
|
+
end
|
24
|
+
|
25
|
+
def anti?
|
26
|
+
return @anti
|
27
|
+
end
|
28
|
+
|
29
|
+
def has_data?
|
30
|
+
return !(@dir || @anti)
|
31
|
+
end
|
32
|
+
|
33
|
+
def inspect
|
34
|
+
if (@anti)
|
35
|
+
type = "anti"
|
36
|
+
elsif (@dir)
|
37
|
+
type = "dir"
|
38
|
+
else
|
39
|
+
type = "file"
|
40
|
+
end
|
41
|
+
str = path.to_s.encode(Encoding::ASCII, invalid: :replace, undef: :replace, replace: "?")
|
42
|
+
return "#<EntryInfo: #{index}, #{type}, #{str}>"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
Binary file
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require("stringio")
|
2
|
+
|
3
|
+
module SevenZipRuby
|
4
|
+
class SevenZipReader
|
5
|
+
class << self
|
6
|
+
def open(*args, &block)
|
7
|
+
szr = self.new
|
8
|
+
szr.open(*args)
|
9
|
+
if (block)
|
10
|
+
block.call(szr)
|
11
|
+
szr.close
|
12
|
+
else
|
13
|
+
szr
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def extract(stream, index, dir = ".", param = {})
|
18
|
+
password = { password: param.delete(:password) }
|
19
|
+
self.open(stream, password) do |szr|
|
20
|
+
szr.extract(index, dir, param)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def extract_all(stream, dir = ".", param = {})
|
25
|
+
password = { password: param.delete(:password) }
|
26
|
+
self.open(stream, password) do |szr|
|
27
|
+
szr.extract_all(dir, param)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def verify(*args)
|
32
|
+
szr = self.open(*args)
|
33
|
+
ret = szr.verify
|
34
|
+
szr.close
|
35
|
+
return ret
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def open(stream, param = {})
|
40
|
+
param[:password] = param[:password].to_s if (param[:password])
|
41
|
+
stream.set_encoding(Encoding::ASCII_8BIT)
|
42
|
+
open_impl(stream, param)
|
43
|
+
return self
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def file_proc(base_dir)
|
48
|
+
base_dir = base_dir.to_s
|
49
|
+
return Proc.new do |type, arg|
|
50
|
+
case(type)
|
51
|
+
when :stream
|
52
|
+
ret = nil
|
53
|
+
if (arg.anti?)
|
54
|
+
arg.path.rmtree if (arg.path.exist?)
|
55
|
+
elsif (arg.file?)
|
56
|
+
path = arg.path.expand_path(base_dir)
|
57
|
+
path.parent.mkpath
|
58
|
+
ret = File.open(path, "wb")
|
59
|
+
else
|
60
|
+
path = arg.path.expand_path(base_dir)
|
61
|
+
path.mkpath
|
62
|
+
set_file_attribute(path.to_s, arg.attrib) if (arg.attrib)
|
63
|
+
path.utime(arg.atime || path.atime, arg.mtime || path.mtime)
|
64
|
+
end
|
65
|
+
next ret
|
66
|
+
|
67
|
+
when :result
|
68
|
+
arg[:stream].close
|
69
|
+
unless (arg[:info].anti?)
|
70
|
+
path = arg[:info].path.expand_path(base_dir)
|
71
|
+
set_file_attribute(path.to_s, arg[:info].attrib) if (arg[:info].attrib)
|
72
|
+
path.utime(arg[:info].atime || path.atime, arg[:info].mtime || path.mtime)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
private :file_proc
|
78
|
+
|
79
|
+
def data_proc(output, idx_prj)
|
80
|
+
return Proc.new do |type, arg|
|
81
|
+
case(type)
|
82
|
+
when :stream
|
83
|
+
ret = (arg.has_data? ? StringIO.new("".b) : nil)
|
84
|
+
unless (arg.has_data?)
|
85
|
+
output[idx_prj[arg.index]] = nil
|
86
|
+
end
|
87
|
+
next ret
|
88
|
+
|
89
|
+
when :result
|
90
|
+
arg[:stream].close
|
91
|
+
if (arg[:info].has_data?)
|
92
|
+
output[idx_prj[arg[:info].index]] = arg[:stream].string
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
private :data_proc
|
99
|
+
|
100
|
+
|
101
|
+
def test
|
102
|
+
begin
|
103
|
+
return test_all_impl(nil)
|
104
|
+
rescue
|
105
|
+
return false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
alias verify test
|
109
|
+
|
110
|
+
def verify_detail
|
111
|
+
begin
|
112
|
+
return test_all_impl(true)
|
113
|
+
rescue
|
114
|
+
return nil
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def extract(index, dir = ".")
|
119
|
+
path = File.expand_path(dir)
|
120
|
+
case(index)
|
121
|
+
when Symbol
|
122
|
+
raise SevenZipError.new("Argument error") unless (index == :all)
|
123
|
+
return extract_all(path)
|
124
|
+
when Array
|
125
|
+
index_list = index.map(&:to_i).sort.uniq
|
126
|
+
extract_files_impl(index_list, file_proc(path))
|
127
|
+
else
|
128
|
+
extract_impl(index.to_i, file_proc(path))
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def extract_all(dir = ".")
|
133
|
+
extract_all_impl(file_proc(File.expand_path(dir)))
|
134
|
+
end
|
135
|
+
|
136
|
+
def extract_if(dir = ".", &block)
|
137
|
+
extract(entries.select(&block).map(&:index), dir)
|
138
|
+
end
|
139
|
+
|
140
|
+
def extract_data(index)
|
141
|
+
case(index)
|
142
|
+
when :all
|
143
|
+
idx_prj = Object.new
|
144
|
+
def idx_prj.[](index)
|
145
|
+
return index
|
146
|
+
end
|
147
|
+
|
148
|
+
ret = []
|
149
|
+
extract_all_impl(data_proc(ret, idx_prj))
|
150
|
+
return ret
|
151
|
+
|
152
|
+
when Array
|
153
|
+
index_list = index.map(&:to_i)
|
154
|
+
idx_prj = Hash[*(index_list.each_with_index.map{ |idx, i| [ idx, i ] }.flatten)]
|
155
|
+
|
156
|
+
ret = []
|
157
|
+
extract_files_impl(index_list, data_proc(ret, idx_prj))
|
158
|
+
return ret
|
159
|
+
|
160
|
+
else
|
161
|
+
index = index.to_i
|
162
|
+
item = entry(index)
|
163
|
+
return nil unless (item.has_data?)
|
164
|
+
|
165
|
+
idx_prj = Object.new
|
166
|
+
def idx_prj.[](index)
|
167
|
+
return 0
|
168
|
+
end
|
169
|
+
|
170
|
+
ret = []
|
171
|
+
extract_impl(index, data_proc(ret, idx_prj))
|
172
|
+
return ret[0]
|
173
|
+
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
Reader = SevenZipReader
|
180
|
+
end
|