bc3 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/BCSS_Binary_Format.txt +46 -39
- data/bin/bc3_merge.rb +7 -4
- data/bin/bc3_search.rb +342 -0
- data/lib/bc3.rb +5 -5
- data/lib/bc3/file.rb +87 -8
- data/lib/bc3/folder.rb +93 -44
- data/lib/bc3/helper.rb +12 -0
- data/lib/bc3/parse.rb +50 -25
- data/lib/bc3/snapshot.rb +241 -13
- data/unittest/unittest_bc3_file.rb +6 -0
- data/unittest/unittest_bc3_folder.rb +32 -6
- data/unittest/unittest_bc3_merge.rb +4 -1
- data/unittest/unittest_bc3_search.rb +231 -0
- data/unittest/unittest_bc3_snapshot.rb +218 -30
- metadata +11 -6
data/lib/bc3.rb
CHANGED
@@ -34,15 +34,13 @@ Prepare a virtual folder structure as you would like to have
|
|
34
34
|
and use BC3 to convert your real structure to your wishes.
|
35
35
|
|
36
36
|
==Scan for identic files.
|
37
|
-
|
38
|
-
The only way to find duplicate files is to flatten your folder structure so that all the files appear to be at the same level. You then can enable/show the CRC column, sort by it, then manually scan the file list for files with the same size and CRC code. I wouldn't advise it for a large number of files and folders, though. It could take a while to calculate all the CRC values, and it would be a tedious process to manually look through them all for dups.
|
39
|
-
</em>
|
40
|
-
http://www.scootersoftware.com/vbulletin/showpost.php?p=27736&postcount=4
|
37
|
+
See also bin/bc3_search.rb
|
41
38
|
|
42
39
|
With this gem, you can analyse a snapshot, copy the data in a hash
|
43
40
|
and search for duplicate CRCs
|
44
41
|
|
45
42
|
|
43
|
+
|
46
44
|
=Warning and Restrictions
|
47
45
|
Please don't
|
48
46
|
require 'bc3'
|
@@ -69,8 +67,10 @@ Maximum 2GB (more is supported by BC3, but not by this gem).
|
|
69
67
|
=end
|
70
68
|
require 'date'
|
71
69
|
require 'zlib'
|
70
|
+
require 'yaml'
|
72
71
|
|
73
72
|
require 'log4r'
|
73
|
+
|
74
74
|
$log = Log4r::Logger.new('BC3')
|
75
75
|
$log.outputters = Log4r::StdoutOutputter.new('log_stdout')
|
76
76
|
$log.level = Log4r::INFO
|
@@ -85,5 +85,5 @@ require 'bc3/time'
|
|
85
85
|
require 'bc3/parse'
|
86
86
|
|
87
87
|
module BC3
|
88
|
-
VERSION = '0.1.
|
88
|
+
VERSION = '0.1.1'
|
89
89
|
end
|
data/lib/bc3/file.rb
CHANGED
@@ -13,7 +13,7 @@ If you need the original File inside BC3-module, use
|
|
13
13
|
KEYS = [:filename, :filesize ]
|
14
14
|
KEYS_OPTIONAL = [
|
15
15
|
:timestamp, :crc, :attributes,
|
16
|
-
:version,
|
16
|
+
:version, :utfpath, :utfsymlink,
|
17
17
|
]
|
18
18
|
|
19
19
|
=begin rdoc
|
@@ -23,7 +23,7 @@ Arguments are given in a hash.
|
|
23
23
|
Must contain KEYS and supports KEYS_OPTIONAL
|
24
24
|
=end
|
25
25
|
def initialize( args )
|
26
|
-
raise ArgumentError unless args.kind_of?(Hash)
|
26
|
+
raise ArgumentError, "No hash given (#{args.inspect})" unless args.kind_of?(Hash)
|
27
27
|
KEYS.each{|key|
|
28
28
|
raise ArgumentError, "Missing Key #{key}" unless args.has_key?(key)
|
29
29
|
}
|
@@ -38,7 +38,10 @@ Must contain KEYS and supports KEYS_OPTIONAL
|
|
38
38
|
@attributes = args[:attributes] || Attrib::Archive
|
39
39
|
|
40
40
|
@version = args[:version] #-> Extended File
|
41
|
+
@utfpath = args[:utfpath] #-> Extended File
|
42
|
+
@utfsymlink = args[:utfsymlink] #-> Extended File
|
41
43
|
|
44
|
+
@snapshotpath = {}
|
42
45
|
#Test content
|
43
46
|
raise ArgumentError, "timestamp is no time-object" unless @timestamp.kind_of?(Time)
|
44
47
|
end
|
@@ -52,7 +55,7 @@ The argument must contain:
|
|
52
55
|
def self.new_by_filename( filename )
|
53
56
|
$log.debug("Build file #{filename} from file system")
|
54
57
|
|
55
|
-
#fixme:
|
58
|
+
#fixme: get attributes from file system
|
56
59
|
#~ p ::File.stat(filename)
|
57
60
|
#~ Get attributes: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/68298
|
58
61
|
|
@@ -69,16 +72,27 @@ The argument must contain:
|
|
69
72
|
} #fixme crc if ...
|
70
73
|
return File.new( settings )
|
71
74
|
end
|
75
|
+
#Name of the file
|
72
76
|
attr_reader :filename
|
77
|
+
#Name of the file
|
78
|
+
alias :basename :filename
|
79
|
+
attr_reader :crc
|
80
|
+
#Path (location) in snapshots
|
81
|
+
attr_reader :snapshotpath
|
73
82
|
|
74
83
|
def to_hash()
|
75
|
-
{
|
84
|
+
hash = {
|
76
85
|
filename: @filename,
|
77
86
|
filesize: @filesize,
|
78
87
|
crc: @crc,
|
79
88
|
attributes: @attributes,
|
80
|
-
timestamp: @timestamp
|
89
|
+
timestamp: @timestamp,
|
81
90
|
}
|
91
|
+
hash[:version] = @version if @version
|
92
|
+
hash[:utfpath] = @utfpath if @utfpath
|
93
|
+
hash[:utfsymlink] = @utfsymlink if @utfsymlink
|
94
|
+
|
95
|
+
hash
|
82
96
|
end
|
83
97
|
def inspect()
|
84
98
|
"<BC3::File #{@filename}>"
|
@@ -99,7 +113,11 @@ ID_FILE (0x02)
|
|
99
113
|
=end
|
100
114
|
def bcss()
|
101
115
|
bcss = "".force_encoding('BINARY')
|
102
|
-
|
116
|
+
if @version or @utfpath or @utfsymlink
|
117
|
+
bcss << 3 #with file extended_headers
|
118
|
+
else
|
119
|
+
bcss << 2
|
120
|
+
end
|
103
121
|
bcss << @filename.size
|
104
122
|
bcss << @filename
|
105
123
|
bcss << fixnum2int64(@timestamp.time2ad)
|
@@ -113,8 +131,69 @@ ID_FILE (0x02)
|
|
113
131
|
|
114
132
|
#CRC32
|
115
133
|
bcss << fixnum2int32(@crc || 0)
|
116
|
-
|
134
|
+
#extended header
|
135
|
+
bcss << bcss_extended_headers if @version or @utfpath or @utfsymlink
|
136
|
+
|
117
137
|
bcss
|
118
138
|
end
|
119
|
-
|
139
|
+
=begin rdoc
|
140
|
+
|
141
|
+
ID_FILE (0x02) +
|
142
|
+
ExtraLen : UInt16
|
143
|
+
ExtraData : Byte[ExtraLen]
|
144
|
+
|
145
|
+
=====================
|
146
|
+
File Extended Headers
|
147
|
+
=====================
|
148
|
+
|
149
|
+
Like extended headers, file extended headers should be written in ascending
|
150
|
+
numeric order. Multiple headers may occur within a single ID_FILE_EX record,
|
151
|
+
and compliant parsers should break once they read a type they don't recognize.
|
152
|
+
|
153
|
+
FILE_EX_VERSION (0x01)
|
154
|
+
String representation of an executable file's Major/Minor/Maint/Build
|
155
|
+
version (e.g., "2.11.28.3542").
|
156
|
+
|
157
|
+
Length : UByte
|
158
|
+
Data : char[Length]
|
159
|
+
|
160
|
+
|
161
|
+
FILE_EX_UTF8 (0x02)
|
162
|
+
UTF-8 encoded filename. Stored as a FileExString. Only used if the UTF-8
|
163
|
+
name doesn't match the ANSI encoded one or if the filename is longer than 255
|
164
|
+
characters.
|
165
|
+
|
166
|
+
|
167
|
+
FILE_EX_LINK_PATH (0x03)
|
168
|
+
UTF-8 encoded symbolic link path. Stored as a FileExString.
|
169
|
+
|
170
|
+
=end
|
171
|
+
def bcss_extended_headers()
|
172
|
+
ehead = ''
|
173
|
+
if @version
|
174
|
+
ehead << 1
|
175
|
+
ehead << @version.size
|
176
|
+
ehead << @version
|
177
|
+
end
|
178
|
+
if @utfpath
|
179
|
+
ehead << 2
|
180
|
+
utfpath = @utfpath.dup.force_encoding('binary')
|
181
|
+
ehead << utfpath.size
|
182
|
+
ehead << utfpath
|
183
|
+
end
|
184
|
+
if @utfsymlink
|
185
|
+
ehead << 3
|
186
|
+
utfsymlink = @utfsymlink.dup.force_encoding('binary')
|
187
|
+
ehead << utfsymlink.size
|
188
|
+
ehead << utfsymlink
|
189
|
+
end
|
190
|
+
#fixme
|
191
|
+
|
192
|
+
bcss = ''
|
193
|
+
bcss << fixnum2int16(ehead.size + 2) #size including this length
|
194
|
+
bcss << ehead
|
195
|
+
|
196
|
+
bcss
|
197
|
+
end
|
198
|
+
end #File
|
120
199
|
end #BC3
|
data/lib/bc3/folder.rb
CHANGED
@@ -10,7 +10,7 @@ module BC3
|
|
10
10
|
def initialize( dirname, timestamp = Time.now, attributes = nil )
|
11
11
|
@dirname = dirname
|
12
12
|
$log.debug("Create folder #{@dirname}")
|
13
|
-
raise ArgumentError unless @dirname.is_a?(String)
|
13
|
+
raise ArgumentError, "Dirname no string #{@dirname.inspect}" unless @dirname.is_a?(String)
|
14
14
|
|
15
15
|
@timestamp = timestamp || Time.now
|
16
16
|
raise ArgumentError, "No Timestamp for Folder" unless @timestamp.is_a?(Time)
|
@@ -18,6 +18,8 @@ module BC3
|
|
18
18
|
@attributes = attributes || Attrib::Directory
|
19
19
|
|
20
20
|
@content = {}
|
21
|
+
@snapshotpath = {}
|
22
|
+
|
21
23
|
end
|
22
24
|
=begin rdoc
|
23
25
|
Create a folder from a hash.
|
@@ -81,42 +83,84 @@ The argument must contain:
|
|
81
83
|
end
|
82
84
|
#Name of the folder
|
83
85
|
attr_reader :dirname
|
86
|
+
#Name of the folder
|
87
|
+
alias :basename :dirname
|
88
|
+
#Path (location) in snapshots
|
89
|
+
attr_reader :snapshotpath
|
90
|
+
#timestamp
|
91
|
+
attr_reader :timestamp
|
92
|
+
attr_reader :attributes
|
93
|
+
|
84
94
|
=begin rdoc
|
85
|
-
Add content to
|
95
|
+
Add content to folder.
|
86
96
|
The 'content' must support the bcss-method.
|
87
97
|
|
88
98
|
Content may be:
|
89
|
-
* another folder
|
99
|
+
* another folder (if pathes are similar to existing folder: see #mixin)
|
90
100
|
* a file
|
101
|
+
|
102
|
+
If another object with similar name exists, it will be overwritten.
|
91
103
|
=end
|
92
104
|
def << (content)
|
93
|
-
|
105
|
+
#Check for BC3::File or BC3::Folder
|
106
|
+
if ! ( content.respond_to?( :bcss ) and content.respond_to?( :basename ) )
|
94
107
|
$log.error("Add unknown datatype as content #{content.inspect}")
|
95
108
|
raise ArgumentError, "Add unknown datatype as content #{content.inspect}"
|
96
109
|
end
|
97
110
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
111
|
+
#reset index in relatd snapshot.
|
112
|
+
self.snapshotpath.each{|snapshot, path| snapshot.reset_index }
|
113
|
+
|
114
|
+
if @content[content.basename] #content already available
|
115
|
+
#Target and new element are both folders?
|
116
|
+
if @content[content.basename].respond_to? :dirname and content.respond_to? :dirname
|
117
|
+
$log.debug("Mix into folder #{content.basename} in folder #{self.inspect}")
|
118
|
+
#return the folder, where it is mixed in
|
119
|
+
content = @content[content.basename].mixin(content)
|
103
120
|
else
|
104
|
-
$log.
|
105
|
-
@content[
|
121
|
+
$log.info("Overwrite #{content.basename} in folder #{self.inspect}")
|
122
|
+
@content[content.basename] = content
|
106
123
|
end
|
107
|
-
else
|
108
|
-
@content[
|
124
|
+
else #add new content
|
125
|
+
@content[content.basename] = content
|
109
126
|
$log.debug("Add to folder #{self.inspect}: #{content.inspect}") if $log.debug?
|
110
127
|
end
|
128
|
+
content #return the folder, where it is mixed in
|
111
129
|
end
|
112
130
|
=begin rdoc
|
113
131
|
Merge two folders.
|
114
132
|
The content of a folder is added to the actual content.
|
115
133
|
=end
|
116
134
|
def mixin( folder )
|
117
|
-
$log.
|
135
|
+
$log.debug("Mix in content to folder #{@dirname} in folder #{self.inspect}")
|
136
|
+
raise ArgumentError, "Add unknown datatype as content #{content.inspect}" unless folder.is_a?(Folder)
|
118
137
|
folder.each{|key, content| self << content }
|
138
|
+
self #return the folder, where it is mixed in
|
139
|
+
end
|
140
|
+
=begin rdoc
|
141
|
+
Add an element with a given path.
|
142
|
+
|
143
|
+
Folders will be created for the complete path if necessary.
|
144
|
+
=end
|
145
|
+
def add_with_path(path, element)
|
146
|
+
path = path.split(%r{[\\\/]}) unless path.is_a?(Array)
|
147
|
+
if path.empty?
|
148
|
+
self << element
|
149
|
+
else #subpath
|
150
|
+
#Search target folder
|
151
|
+
target = nil
|
152
|
+
@content.each{|name, folder|
|
153
|
+
if name == path.first
|
154
|
+
target = folder
|
155
|
+
break #target found
|
156
|
+
end
|
157
|
+
}
|
158
|
+
self << target = Folder.new(path.first) unless target
|
159
|
+
path.shift
|
160
|
+
target.add_with_path( path, element )
|
119
161
|
end
|
162
|
+
element
|
163
|
+
end
|
120
164
|
=begin rdoc
|
121
165
|
Loop on content of the folder and return path + object.
|
122
166
|
|
@@ -127,27 +171,26 @@ Options may be
|
|
127
171
|
The result is not nested, pathes are complete
|
128
172
|
=end
|
129
173
|
def each(*options)
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
end
|
174
|
+
|
175
|
+
options = [:folders, :files ] if options.empty? #take all, but not recursive
|
176
|
+
|
177
|
+
extract = {}
|
178
|
+
@content.each{|key, content|
|
179
|
+
case content
|
180
|
+
when File
|
181
|
+
extract[key] = content if options.include?(:files)
|
182
|
+
when Folder
|
183
|
+
extract[key+'/'] = content if options.include?(:folders)
|
184
|
+
else
|
185
|
+
raise "Internal error"
|
186
|
+
end
|
187
|
+
|
188
|
+
if options.include?(:recursive) and content.is_a?(Folder)
|
189
|
+
content.each(*options).each{|subkey, subcontent|
|
190
|
+
extract[[key, subkey].join('/')] = subcontent
|
191
|
+
}
|
192
|
+
end
|
193
|
+
}
|
151
194
|
|
152
195
|
if block_given?
|
153
196
|
extract.each{|key, content| yield key, content }
|
@@ -155,6 +198,7 @@ Options may be
|
|
155
198
|
extract
|
156
199
|
end
|
157
200
|
end
|
201
|
+
|
158
202
|
#~ def values();@content.values;end #fixme
|
159
203
|
def inspect()
|
160
204
|
"<BC3::Folder #{@dirname}>"
|
@@ -211,12 +255,14 @@ end #BC3
|
|
211
255
|
|
212
256
|
if $0 == __FILE__
|
213
257
|
|
214
|
-
folder = BC3::Folder.new('
|
215
|
-
folder << BC3::Folder.new('
|
216
|
-
folder << BC3::File.new( filename: 'x2', filesize: 1)
|
217
|
-
folder << BC3::File.new( filename: 'x', filesize: 1)
|
258
|
+
folder = BC3::Folder.new('base')
|
259
|
+
#~ folder << BC3::Folder.new('dir')
|
260
|
+
#~ folder << BC3::File.new( filename: 'x2', filesize: 1)
|
261
|
+
#~ folder << BC3::File.new( filename: 'x', filesize: 1)
|
262
|
+
#~ folder.add_with_path('dir2', BC3::File.new(filename: 'test.txt', filesize: 5 ))
|
263
|
+
folder.add_with_path('dir2/subdir', BC3::File.new(filename: 'test,txt', filesize: 5 ))
|
218
264
|
|
219
|
-
puts folder.
|
265
|
+
puts folder.to_hash.to_yaml
|
220
266
|
exit
|
221
267
|
|
222
268
|
require 'YAML'
|
@@ -233,7 +279,10 @@ exit
|
|
233
279
|
:filesize: 15
|
234
280
|
}))
|
235
281
|
|
236
|
-
x = folder.each(:folders,:files, :recursive)
|
237
|
-
puts "=========="
|
238
|
-
puts
|
239
|
-
|
282
|
+
#~ x = folder.each(:folders,:files, :recursive)
|
283
|
+
#~ puts "=========="
|
284
|
+
puts folder.to_hash.to_yaml
|
285
|
+
|
286
|
+
|
287
|
+
|
288
|
+
end
|
data/lib/bc3/helper.rb
CHANGED
@@ -97,5 +97,17 @@ Same as Helper#fixnum2int64, but as 4 bytes string.
|
|
97
97
|
bindata
|
98
98
|
end
|
99
99
|
|
100
|
+
=begin rdoc
|
101
|
+
Same as Helper#fixnum2int64, but as 2 bytes string.
|
102
|
+
=end
|
103
|
+
def fixnum2int16( int )
|
104
|
+
bindata = ''.force_encoding('BINARY')
|
105
|
+
('%016b' % int).scan(/(\d{8})/).flatten.reverse.each{|b|
|
106
|
+
bindata << b.to_i(2)
|
107
|
+
}
|
108
|
+
raise ArgumentError unless bindata.size == 2 #int was too big
|
109
|
+
bindata
|
110
|
+
end
|
111
|
+
|
100
112
|
end #Helper
|
101
113
|
end #BC3
|
data/lib/bc3/parse.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
=begin rdoc
|
2
|
+
Parser for BC3-Snapshots.
|
2
3
|
|
4
|
+
The snapshot may be compressed or uncompressed.
|
5
|
+
|
6
|
+
No support for UTF-8.
|
3
7
|
=end
|
4
|
-
$:.unshift('..')
|
8
|
+
$:.unshift('..') if $0 == __FILE__ #only test
|
5
9
|
require 'bc3'
|
6
10
|
|
7
11
|
require "zlib"
|
@@ -15,9 +19,24 @@ Parser for a given bcss-file.
|
|
15
19
|
|
16
20
|
=end
|
17
21
|
def initialize( filename )
|
18
|
-
rawdata = nil
|
19
22
|
@log = $log #fixme replace with sublogger
|
20
23
|
@log.info("Read and parse #{filename}")
|
24
|
+
@timestamp = Time.now
|
25
|
+
case filename
|
26
|
+
when /\.ya?ml/
|
27
|
+
::File.open(filename ){|f|
|
28
|
+
@snapshot = Snapshot.new_hash(YAML.read(f))
|
29
|
+
}
|
30
|
+
when /\.bcssx?/
|
31
|
+
read_bcss(filename)
|
32
|
+
else
|
33
|
+
raise ArgumentError, "Undefined filetype #{::File.extname(filename)}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
=begin rdoc
|
37
|
+
=end
|
38
|
+
def read_bcss(filename)
|
39
|
+
rawdata = nil
|
21
40
|
::File.open( filename, 'rb' ){|f|
|
22
41
|
rawdata = f.read()
|
23
42
|
}
|
@@ -43,7 +62,6 @@ Parser for a given bcss-file.
|
|
43
62
|
[14..N] = Path (char[]) |
|
44
63
|
=end
|
45
64
|
#~ header = rawdata[0..17]
|
46
|
-
@timestamp = Time.now
|
47
65
|
@timestamp, tail = parse_filetime(rawdata[8,8])
|
48
66
|
#Analyse flags - byte position 16/hex10
|
49
67
|
@compressed = rawdata[16].getbyte(0) & 1 != 0
|
@@ -163,7 +181,7 @@ ID_FILE_EX (0x03)
|
|
163
181
|
extradata, tail = parse_longstring(tail)
|
164
182
|
extradata = parse_file_extended_headers(extradata)
|
165
183
|
unless extradata #Skip at prob
|
166
|
-
@log.warn("Skip #{filename}")
|
184
|
+
@log.warn("Skip #{filename} because of unsupported extended header")
|
167
185
|
next
|
168
186
|
end
|
169
187
|
folderstack.last << File.new({
|
@@ -279,24 +297,27 @@ FILE_EX_LINK_PATH (0x03)
|
|
279
297
|
=end
|
280
298
|
def parse_file_extended_headers(extradata_string)
|
281
299
|
extradata = {}
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
+
#loop on extradata...
|
301
|
+
while !extradata_string.empty?
|
302
|
+
case flag = extradata_string.slice!(0)
|
303
|
+
when "\x01"
|
304
|
+
extradata[:version], extradata_string = parse_shortstring( extradata_string )
|
305
|
+
when "\x02" #UTF-8 encoded filename
|
306
|
+
extradata[:utfpath], extradata_string = parse_shortstring( extradata_string )
|
307
|
+
extradata[:utfpath].force_encoding('utf-8')
|
308
|
+
when "\x03" #UTF-8 encoded symbolic link path
|
309
|
+
extradata[:utfsymlink], extradata_string = parse_shortstring( extradata_string )
|
310
|
+
extradata[:utfsymlink].force_encoding('utf-8')
|
311
|
+
else
|
312
|
+
@log.error("Undefined extra data handling #{flag.inspect} <#{extradata_string.inspect}>")
|
313
|
+
extradata_string = '' #stop evaluation
|
314
|
+
end
|
315
|
+
end
|
316
|
+
#~ unless extradata_string.empty?
|
317
|
+
#~ @log.warn("Undefined extra data handling <#{extradata_string.inspect}>")
|
318
|
+
#~ p extradata_string
|
319
|
+
#~ end
|
320
|
+
extradata
|
300
321
|
end
|
301
322
|
end #SnapshotParser
|
302
323
|
def to_hash; @snapshot.to_hash; end
|
@@ -305,8 +326,12 @@ end
|
|
305
326
|
if $0 == __FILE__
|
306
327
|
require 'yaml'
|
307
328
|
#~ x = BC3::SnapshotParser.new('../../examples/results/testdir_2011-01-16.bcssx' )
|
308
|
-
x = BC3::SnapshotParser.new('../../examples/results/bc3_2011-01-16.bcss' )
|
309
|
-
|
310
|
-
puts x.snapshot.to_hash.to_yaml
|
329
|
+
#~ x = BC3::SnapshotParser.new('../../examples/results/bc3_2011-01-16.bcss' )
|
330
|
+
x = BC3::SnapshotParser.new('../../Uncompressed Sample/Uncompressed Sample.bcss' )
|
331
|
+
#~ puts x.snapshot.to_hash.to_yaml
|
311
332
|
x.snapshot.save('../../Uncompressed Sample/Uncompressed Sample_reconstructed.bcss')
|
333
|
+
FileUtils.copy(
|
334
|
+
'../../Uncompressed Sample/Uncompressed Sample_reconstructed.bcss',
|
335
|
+
'../../Uncompressed Sample/Uncompressed Sample_reconstructed.xxxx'
|
336
|
+
)
|
312
337
|
end
|