Method: SevenZipRuby::SevenZipReader#extract_data

Defined in:
lib/seven_zip_ruby/seven_zip_reader.rb

#extract_data(index) ⇒ Object

Extract some entries of 7zip archive and return the extracted data.

Args

index

Index of the entry to extract. :all, Integer or Array of Integer can be specified.

Examples

File.open("filename.7z", "rb") do |file|
  SevenZipRuby::SevenZipReader.open(file) do |szr|
    small_entries = szr.entries.select{ |i| i.size < 1024 }

    data_list = szr.extract_data(small_entries)
    # => [ "file contents1", "file contents2", ... ]
  end
end

File.open("filename.7z", "rb") do |file|
  SevenZipRuby::SevenZipReader.open(file) do |szr|
    largest_entry = szr.entries.max_by{ |i| i.file? ? i.size : 0 }

    data_list = szr.extract_data(largest_entry)
    # => "file contents..."
  end
end

416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
# File 'lib/seven_zip_ruby/seven_zip_reader.rb', line 416

def extract_data(index)
  case(index)
  when :all
    idx_prj = Object.new
    def idx_prj.[](index)
      return index
    end

    ret = []
    synchronize do
      extract_all_impl(data_proc(ret, idx_prj))
    end
    return ret

  when Enumerable
    index_list = index.map(&:to_i)
    idx_prj = Hash[*(index_list.each_with_index.map{ |idx, i| [ idx, i ] }.flatten)]

    ret = []
    synchronize do
      extract_files_impl(index_list, data_proc(ret, idx_prj))
    end
    return ret

  when nil
    raise ArgumentError.new("Invalid parameter index")

  else
    index = index.to_i
    item = entry(index)
    return nil unless (item.has_data?)

    idx_prj = Object.new
    def idx_prj.[](index)
      return 0
    end

    ret = []
    synchronize do
      extract_impl(index, data_proc(ret, idx_prj))
    end
    return ret[0]

  end
end