EXtremeZip 2022.2.6 → 2022.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/extremeunzip.zzaqsu.rb +20 -22
- data/lib/extremezip.zzaqsv.rb +120 -29
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da998c51added74a4ed2c3aad2e8ceb768152b7255f9807d92703dc503485b71
|
4
|
+
data.tar.gz: 6bf1557f7c8a52c6c065cac5a7c70374202c60170bd0717fb2db100540a22c8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba80a4d83712386988790d45ae7916b52cba1107f7a7bef496fba3e948af2d50c57f5cae95530df2e65cb13efc869bf5e71fe701b84af28b69fd2b4eac321000
|
7
|
+
data.tar.gz: 1a9cd925dbfc6624d02bfe2861072fd8c78d87ee9f2762ee6cc56fcbcaff4ffcc09cc7e2b139c4884e111770577f0b4fd43471a5605b27073f76d495680c9179
|
data/lib/extremeunzip.zzaqsu.rb
CHANGED
@@ -92,46 +92,44 @@ end # def extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) #根据
|
|
92
92
|
|
93
93
|
# 解压
|
94
94
|
def exuz(rootPath)
|
95
|
-
|
96
|
-
|
97
|
-
currentBlockFile = File.new(rootPath, 'rb') # 打开文件
|
95
|
+
result = true # 解压结果
|
98
96
|
|
99
|
-
|
97
|
+
currentBlockFile = File.new(rootPath, 'rb') # 打开文件
|
100
98
|
|
101
|
-
|
99
|
+
@wholeFileContent = currentBlockFile.read # 读取全部内容
|
102
100
|
|
103
|
-
|
101
|
+
currentBlockFile.close # 关闭文件
|
104
102
|
|
105
|
-
|
103
|
+
checkMemoryUsage(60)
|
106
104
|
|
107
|
-
|
105
|
+
wholeCborByteArray = @wholeFileContent[4..-1] # 从第5个到末尾
|
108
106
|
|
109
107
|
begin # 可能出错。
|
110
|
-
|
108
|
+
options = {:tolerant => true}
|
111
109
|
|
112
|
-
|
110
|
+
wholeCbor = CBOR.decode(wholeCborByteArray, options) # 解码
|
113
111
|
|
114
|
-
|
112
|
+
fileVersion = wholeCbor['version'] # 获取版本号
|
115
113
|
|
116
114
|
if (fileVersion < 14) # 版本号过小
|
117
|
-
|
118
|
-
|
115
|
+
checkMemoryUsage(85)
|
116
|
+
puts 'file version too old' # 报告错误
|
119
117
|
else # 版本号够大
|
120
|
-
|
118
|
+
compressedVfsMenu = wholeCbor['vfsMenu'] # 获取压缩后的目录内容
|
121
119
|
|
122
|
-
|
123
|
-
|
120
|
+
checkMemoryUsage(90)
|
121
|
+
replyByteArray = LZMA.decompress(compressedVfsMenu) # 解码目录VFS字节数组内容
|
124
122
|
|
125
|
-
|
123
|
+
checkMemoryUsage(95)
|
126
124
|
|
127
|
-
|
125
|
+
victoriaFreshDataFile = extractVfsDataWithVersionExternalFile(wholeCbor, fileVersion) # 根据版本号,提取VFS数据内容
|
128
126
|
|
129
|
-
|
130
|
-
|
127
|
+
checkMemoryUsage(100)
|
128
|
+
$clipDownloader = VictoriaFresh.new # 创建下载器。
|
131
129
|
|
132
|
-
|
130
|
+
$clipDownloader.releaseFilesExternalDataFile(replyByteArray, victoriaFreshDataFile) # 释放各个文件
|
133
131
|
|
134
|
-
|
132
|
+
fileToRemove = File.new(victoriaFreshDataFile) # 要删除的文件
|
135
133
|
end # if (fileVersion<14) #版本号过小
|
136
134
|
|
137
135
|
result =true # 解压成功
|
data/lib/extremezip.zzaqsv.rb
CHANGED
@@ -8,6 +8,7 @@ require 'etc' # cpu amount
|
|
8
8
|
require 'cod'
|
9
9
|
require 'uuid'
|
10
10
|
require 'get_process_mem'
|
11
|
+
require 'pathname'
|
11
12
|
|
12
13
|
def checkMemoryUsage(lineNumber)
|
13
14
|
mem = GetProcessMem.new
|
@@ -22,6 +23,7 @@ class ExtremeZip
|
|
22
23
|
@filePartCounter = 0 # 文件分块计数器
|
23
24
|
@responsePipeList = [] # 任务回复管道列表
|
24
25
|
@processIdList = [] # 子进程编号列表。
|
26
|
+
@processTimestamp = Time.new.to_i # 记录进程启动的时间戳。
|
25
27
|
|
26
28
|
@maxSubProcessAmount = Etc.nprocessors # 获取最大的子进程个数
|
27
29
|
|
@@ -57,54 +59,142 @@ class ExtremeZip
|
|
57
59
|
|
58
60
|
@wholeCbor['vfsDataListStart']=198910 # 压缩 VFS 数据列表起始位置。
|
59
61
|
end # addBasicFileInformation # 加入基本文件信息
|
62
|
+
|
63
|
+
def writeStamp(rootPath) # 更新时间戳文件
|
64
|
+
directoryPathName=Pathname.new(rootPath) #构造路径名字对象。
|
65
|
+
datastore= "#{directoryPathName.expand_path}/.exzstamp" # 配置文件路径
|
66
|
+
puts "writing stamp file: #{datastore}" # Debug
|
67
|
+
|
68
|
+
#stamp = wholeCbor['timestamp'] # 获取时间戳
|
69
|
+
stampCbor={} # 时间戳对象。
|
70
|
+
stampCbor['timestamp']= @processTimestamp # 设置时间戳。
|
71
|
+
|
72
|
+
compressed= stampCbor.to_cbor
|
73
|
+
|
74
|
+
extremeZipOutputFile = File.new(datastore, 'wb') # 创建文件
|
75
|
+
extremeZipOutputFile.syswrite(compressed) # 写入文件
|
76
|
+
extremeZipOutputFile.close # 关闭文件
|
77
|
+
|
78
|
+
end # writeStamp # 更新时间戳文件
|
79
|
+
|
80
|
+
def loadStamp(rootPath) # 读取时间戳阈值。
|
81
|
+
stamp=0 # 默认值。
|
82
|
+
fileExists=false # 文件是否存在
|
83
|
+
|
84
|
+
directoryPathName=Pathname.new(rootPath) #构造路径名字对象。
|
85
|
+
|
86
|
+
isFile=directoryPathName.file? #是否是文件。
|
87
|
+
|
88
|
+
unless isFile #是文件就跳过。
|
89
|
+
#陈欣
|
90
|
+
|
91
|
+
datastore= "#{directoryPathName.expand_path}/.exzstamp" # 配置文件路径
|
92
|
+
puts "reading stamp file: #{datastore}" # Debug
|
93
|
+
|
94
|
+
begin # 尝试读取。
|
95
|
+
|
96
|
+
#陈欣
|
97
|
+
|
98
|
+
currentBlockFile = File.new(datastore, 'rb') # 打开文件
|
99
|
+
|
100
|
+
fileExists=true # 文件存在
|
101
|
+
|
102
|
+
stampFileContent = currentBlockFile.read # 读取全部内容
|
103
|
+
|
104
|
+
currentBlockFile.close # 关闭文件
|
105
|
+
|
106
|
+
options = {:tolerant => true}
|
107
|
+
|
108
|
+
wholeCbor = CBOR.decode(stampFileContent, options) # 解码
|
109
|
+
|
110
|
+
puts wholeCbor # Debug
|
111
|
+
puts wholeCbor.inspect # Debug
|
112
|
+
|
113
|
+
stamp = wholeCbor['timestamp'].to_i # 获取时间戳
|
114
|
+
#stamp = wholeCbor.try(:[], 'timestamp') # 获取时间戳
|
115
|
+
|
116
|
+
|
117
|
+
rescue Errno::ENOENT, TypeError
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
end #unless isFile #是文件就跳过。
|
123
|
+
|
124
|
+
return stamp, fileExists # 返回时间戳。
|
125
|
+
end #loadStamp(rootPath) # 读取时间戳阈值。
|
60
126
|
|
61
127
|
# 压缩
|
62
128
|
def exz(rootPath)
|
63
|
-
|
129
|
+
timestampTHreshold, fileExists=loadStamp(rootPath) # 读取时间戳阈值。
|
130
|
+
|
131
|
+
puts "threshold: #{timestampTHreshold}" # Debug
|
132
|
+
|
133
|
+
#陈欣
|
134
|
+
|
135
|
+
if (timestampTHreshold > 0) # 有效的时间戳
|
136
|
+
@clipDownloader.timestampThreshold=timestampTHreshold # 设置文件时间戳阈值。
|
137
|
+
end #if (timestampTHreshold > 0) # 有效的时间戳
|
138
|
+
|
139
|
+
puts "threshold vfs: #{@clipDownloader.timestampThreshold}" # Debug
|
140
|
+
|
141
|
+
if fileExists # 存在文件,则表明将要发生增量压缩
|
142
|
+
@wholeCbor['incremental']=true # 是增量压缩。
|
143
|
+
|
144
|
+
end # if fileExists # 存在文件,则表明用户要求增量压缩
|
64
145
|
|
65
|
-
|
146
|
+
@wholeCbor['timestamp']=@processTimestamp # 记录进程启动的时间戳。
|
147
|
+
|
148
|
+
victoriaFresh, = @clipDownloader.checkOnce(rootPath) # 打包该目录树。
|
66
149
|
|
67
|
-
|
150
|
+
@filePartAmount = @clipDownloader.currentDiskFlushSuffix # 获取文件个数
|
68
151
|
|
69
|
-
|
152
|
+
compressVfsMenu(victoriaFresh) # 压缩目录数据。
|
70
153
|
|
71
|
-
|
154
|
+
addBasicFileInformation # 加入基本文件信息
|
72
155
|
|
73
|
-
|
156
|
+
processIdList, responsePipeList = launchSubProcesses # 启动子进程。
|
74
157
|
|
75
|
-
|
76
|
-
@wholeCbor['vfsDataList'] = @vfsDataList # 加入数据
|
158
|
+
receiveCompressedVfsDataList(processIdList, responsePipeList) # 接收压缩后的数据块列表
|
77
159
|
|
78
|
-
|
160
|
+
checkMemoryUsage(155)
|
161
|
+
@wholeCbor['vfsDataList'] = @vfsDataList # 加入数据
|
162
|
+
|
163
|
+
wholeFileContent = 'exz' + "\0" + @wholeCbor.to_cbor # 追加CBOR字节数组
|
79
164
|
|
80
|
-
|
165
|
+
vfsDataListStart=wholeFileContent.length # 按照现在的序列化情况,计算出来的起始位置。
|
81
166
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
167
|
+
while (vfsDataListStart!=@wholeCbor['vfsDataListStart']) # 计算出的偏移不一致
|
168
|
+
@wholeCbor['vfsDataListStart']=vfsDataListStart # 使用新的值
|
169
|
+
wholeFileContent = 'exz' + "\0" + @wholeCbor.to_cbor # 追加CBOR字节数组
|
170
|
+
vfsDataListStart=wholeFileContent.length # 按照现在的序列化情况,计算出来的起始位置。
|
171
|
+
end
|
87
172
|
|
88
|
-
|
89
|
-
|
173
|
+
# 写入文件:
|
174
|
+
writeFile(wholeFileContent, victoriaFresh) # 写入文件内容
|
90
175
|
|
91
|
-
|
176
|
+
appendVfsDataList victoriaFresh # 追加压缩块列表数据。
|
177
|
+
|
178
|
+
if fileExists # 存在文件,则表明将要发生增量压缩
|
179
|
+
writeStamp (rootPath) # 更新时间戳文件
|
180
|
+
end # if fileExists # 存在文件,则表明用户要求增量压缩
|
181
|
+
|
92
182
|
end # def exz(rootPath)
|
93
183
|
|
94
184
|
# 写入压缩块文件
|
95
185
|
def writeCompressBlock(compressed, processCounter)
|
96
|
-
|
97
|
-
|
98
|
-
|
186
|
+
extremeZipOutputFile = File.new("comressed.#{processCounter}.cex", 'wb') # 创建文件
|
187
|
+
extremeZipOutputFile.syswrite(compressed) # 写入文件
|
188
|
+
extremeZipOutputFile.close # 关闭文件
|
99
189
|
end
|
100
190
|
|
101
191
|
# 追加压缩块列表数据。
|
102
192
|
def appendVfsDataList (victoriaFresh)
|
103
|
-
|
193
|
+
extremeZipOutputFile = File.new("#{victoriaFresh['name']}.exz", 'ab') # 打开文件
|
104
194
|
|
105
|
-
|
195
|
+
processCounter=0 # 块计数器。
|
106
196
|
|
107
|
-
|
197
|
+
@wholeCbor['vfsDataList'].each do
|
108
198
|
#extremeZipOutputFile = File.new("comressed.#{processCounter}.cex", 'wb') # 创建文件
|
109
199
|
|
110
200
|
currentBlockFile = File.new("comressed.#{processCounter}.cex", 'rb') # 打开文件
|
@@ -112,17 +202,18 @@ class ExtremeZip
|
|
112
202
|
wholeFileContent = currentBlockFile.read # 读取全部内容
|
113
203
|
|
114
204
|
currentBlockFile.close # 关闭文件
|
205
|
+
File.delete(currentBlockFile) # 删除数据块文件
|
115
206
|
|
116
207
|
#wholeFileContent=File.read("comressed.#{processCounter}.cex", 'rb') # 读取压缩块。
|
117
208
|
|
118
|
-
|
209
|
+
puts "wirte file contetn length: #{wholeFileContent.length}" # Debghu
|
119
210
|
|
120
|
-
|
211
|
+
extremeZipOutputFile.syswrite(wholeFileContent) # 写入文件
|
121
212
|
|
122
|
-
|
123
|
-
|
213
|
+
processCounter += 1 # 计数
|
214
|
+
end
|
124
215
|
|
125
|
-
|
216
|
+
extremeZipOutputFile.close # 关闭文件
|
126
217
|
end
|
127
218
|
|
128
219
|
# 写入文件内容
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: EXtremeZip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2022.2.
|
4
|
+
version: 2022.2.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hxcan Cai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-02-
|
11
|
+
date: 2022-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cod
|
@@ -86,20 +86,20 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 2022.
|
89
|
+
version: 2022.2.20
|
90
90
|
- - ">="
|
91
91
|
- !ruby/object:Gem::Version
|
92
|
-
version: 2022.
|
92
|
+
version: 2022.2.20
|
93
93
|
type: :runtime
|
94
94
|
prerelease: false
|
95
95
|
version_requirements: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
97
|
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
version: 2022.
|
99
|
+
version: 2022.2.20
|
100
100
|
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: 2022.
|
102
|
+
version: 2022.2.20
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: hx_cbor
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|