Posted: Sat Dec 27, 2008 8:46 pm Post subject: zip - как реализовать выгрузку?
Суть проблемы такова: есть несколько файлов ( например TXT и DBF ) которые являются результатом работы программы и вот их хотелось бы иметь в одном пакете. При чем квалификация пользователей ниже плинтуса.. первое что пришло в голову это закатать все в zip архив ... или как-то так...
Возможно есть варианты?
Как работать с zip файлами в ABAP ?.
P.S. если нет реализаций стандартных, может подкинете ссылочку на формат файла zip? именно файла а не алгоритм компрессии? _________________ (SAP) Система нипель... выпускает лучше, чем впускает!
Использовать класс CL_ABAP_ZIP
но его нету в старых до(SAP 6.40)системах
тогда можно создать два инклуда
метод add добавляет файл в zip, save возвращает xString для сохранения
1. include Z_MSDOS.
Code:
class msdos definition final.
public section.
class-methods: to_date importing date type d returning value(msdos_date) type i.
class-methods: to_time importing time type t returning value(msdos_time) type i.
class-methods: from_date importing msdos_date type i returning value(date) type d.
class-methods: from_time importing msdos_time type i returning value(time) type t.
endclass.
class msdos implementation.
method from_date. " IMPORTING msdos_date TYPE i RETURNING value(date) TYPE d
* MS-DOS format for date:
* Bits 15:9 = year - 1980
* Bits 8:5 = month of year
* Bits 4:0 = day of month
constants: mfe00(2) type x value 'FE00',
m01e0(2) type x value '01E0',
m001f(2) type x value '001F'.
data: x(2) type x,
year type i,
month type i,
day type i,
c4(4) type c,
str type string.
* Bits 15:9 = year - 1980
x = msdos_date.
x = x bit-and mfe00.
x = x div 512. " >> 9
x = x bit-and m001f.
year = x.
year = year + 1980.
write year to c4 using edit mask 'RR____'.
concatenate str c4 into str.
* Bits 8:5 = month of year
x = msdos_date.
x = x bit-and m01e0.
x = x div 32. " >> 5
x = x bit-and m001f.
month = x.
write month to c4 using edit mask 'RR__'.
concatenate str c4 into str.
* Bits 4:0 = day of month
x = msdos_date.
x = x bit-and m001f.
day = x.
write day to c4 using edit mask 'RR__'.
concatenate str c4 into str.
* Build date
translate str using ' 0'.
date = str.
endmethod.
method from_time. " IMPORTING msdos_time TYPE i RETURNING value(time) TYPE t.
constants: mf100(2) type x value 'F100',
m07e0(2) type x value '07E0',
m003f(2) type x value '003F',
m001f(2) type x value '001F'.
data: x(2) type x,
hour type i,
min type i,
c4(4) type c,
str type string.
* Bits 15:11 = hour (24-hour clock)
x = msdos_time.
x = x bit-and mf100.
x = x div 2048. " >> 11
x = x bit-and m001f.
hour = x.
write hour to c4 using edit mask 'RR__'.
concatenate str c4 into str.
* Bits 10:5 = minute
x = msdos_time.
x = x bit-and m07e0.
x = x div 32. " >> 5
x = x bit-and m003f.
min = x.
write min to c4 using edit mask 'RR__'.
concatenate str c4 into str.
* Bits 4:0 = second/2
concatenate str '00' into str.
* Build time
translate str using ' 0'.
time = str.
endmethod.
method to_date. " IMPORTING date TYPE d RETURNING value(msdos_date) TYPE i.
* MS-DOS format for date:
* Bits 15:9 = year - 1980
* Bits 8:5 = month of year
* Bits 4:0 = day of month
data: xdate(2) type x,
x(2) type x,
year type i,
month type i,
day type i.
* Bits 15:9 = year - 1980
year = date+0(4).
x = year - 1980.
x = x * 512. " << 9
xdate = xdate bit-or x.
* Bits 8:5 = month of year
month = date+4(2).
x = month.
x = x * 32. " << 5
xdate = xdate bit-or x.
* Bits 4:0 = day of month
day = date+6(2).
x = day.
xdate = xdate bit-or x.
msdos_date = xdate.
endmethod.
method to_time. " IMPORTING time TYPE t RETURNING value(msdos_time) TYPE i.
*&---------------------------------------------------------------------*
*& Class ZCL_ABAP_ZIP
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
class ZCL_ABAP_ZIP definition.
*"* public components of class CL_ABAP_ZIP
*"* do not include other source files here!!!
public section.
type-pools ihttp .
types:
begin of t_file,
name type string,
date type d,
time type t,
size type i,
end of t_file .
types:
t_files type table of t_file .
types:
begin of t_splice_entry,
name type string,
offset type i,
length type i,
compressed type i,
end of t_splice_entry .
types:
t_splice_entries type standard table of t_splice_entry with default key .
data files type t_files read-only .
methods add
importing
!name type string
!content type xsequence .
methods save
returning
value(zip) type xstring.
class-methods crc32
importing
!content type xstring
returning
value(crc32) type i.
private section.
types:
begin of t_ext,
min_extract_version type i,
gen_flags type i,
compressed type i,
compsize type i,
crc32(4) type x,
filename_len type i,
filename type xstring,
extra_len type i,
extra type xstring,
content type xstring,
end of t_ext .
types:
t_exts type table of t_ext .
data exts type t_exts .
class-data crc32_map type xstring.
endclass. "ZCL_ABAP_ZIP
*&---------------------------------------------------------------------*
*& Class (Implementation) ZCL_ABAP_ZIP
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
class ZCL_ABAP_ZIP implementation.
**************************************************
method add.
field-symbols: <file> type t_file,
<ext> type t_ext.
append initial line to files assigning <file>.
append initial line to exts assigning <ext>.
define writex4. " write xstring
x4 = &2.
concatenate &1 x4 into &1 in byte mode.
end-of-definition.
define write2. " write two bytes from integer
x2 = &2.
concatenate &1 x2+1(1) x2+0(1) into &1 in byte mode.
end-of-definition.
define write4. " write four bytes from integer
x4 = &2.
concatenate &1 x4+3(1) x4+2(1) x4+1(1) x4+0(1) into &1 in byte mode.
end-of-definition.
* Process all files. We write in parallel the zip and the central directory to use later
data: msdos_date type i, msdos_time type i.
field-symbols: <file> type t_file,
<ext> type t_ext.
data: dir type xstring, start_offset(4) type x.
loop at files assigning <file>.
read table exts index sy-tabix assigning <ext>.
start_offset = xstrlen( zip ).
* zip data stream
writex4 zip '504B0304'. " local file header signature
write2 zip <ext>-min_extract_version. " version needed to extract = 2.0 - File is compressed using Deflate
write2 zip <ext>-gen_flags. " general purpose bit flag
write2 zip <ext>-compressed. " compression method: deflated
write2 zip msdos_time. " last mod file time
write2 zip msdos_date. " last mod file date
write4 zip <ext>-crc32. " crc-32
write4 zip <ext>-compsize. " compressed size
write4 zip <file>-size. " uncompressed size
write2 zip <ext>-filename_len. " file name length
write2 zip <ext>-extra_len. " extra field length
concatenate zip <ext>-filename <ext>-extra <ext>-content into zip in byte mode.
* central directory stream (which has a lare duplicate sequence of zip header)
data: dup_offset type i. dup_offset = start_offset + 4.
writex4 dir '504B0102'. " central file header signature
write2 dir 19. " version made by (== pkzip 2.04g)
concatenate dir zip+dup_offset(26) into dir in byte mode. " part which matches exactly zip header
write2 dir 0. " file comment length
write2 dir 0. " disk number start
write2 dir 0. " internal file attributes
write4 dir 0. " external file attributes
write4 dir start_offset. " relative offset of local header
concatenate dir <ext>-filename <ext>-extra into dir in byte mode. " file name + extra info
endloop.
* Write Central Directory
data: lines_files type i. lines_files = lines( files ).
data: xstrlen_dir type i. xstrlen_dir = xstrlen( dir ).
data: offset_dir type i. offset_dir = xstrlen( zip ).
concatenate zip dir into zip in byte mode.
writex4 zip '504B0506'. " End of central directory
write2 zip 0. " number of this disk
write2 zip 0. " number of the disk with the start of the central directory
write2 zip lines_files. " total number of entries in the central directory on this disk
write2 zip lines_files. " total number of entries in the central directory
write4 zip xstrlen_dir. " size of the central directory
write4 zip offset_dir. " offset of start of central directory
write2 zip 0. " ZIP file comment length
endmethod.
**************************************************
method crc32.
* Do the calculations by hand. This is going to be slow. This is going to be a pain.
* What is a man to do?
constants: magic_nr(4) type x value 'EDB88320',
mffffffff(4) type x value 'FFFFFFFF',
m7fffffff(4) type x value '7FFFFFFF',
m00ffffff(4) type x value '00FFFFFF',
m000000ff(4) type x value '000000FF',
m000000(3) type x value '000000'.
if xstrlen( crc32_map ) = 0.
do 256 times.
data: c(4) type x, low_bit(4) type x.
c = sy-index - 1.
do 8 times.
low_bit = '00000001'. low_bit = c bit-and low_bit. " c & 1
c = c div 2. c = c bit-and m7fffffff. " c >> 1 (top is zero, but in ABAP signed!)
if low_bit is not initial.
c = c bit-xor magic_nr.
endif.
enddo.
concatenate crc32_map c into crc32_map in byte mode.
enddo.
endif.
data: len type i, n type i. "#EC *
data: crc(4) type x value mffffffff, x4(4) type x, idx(4) type x.
len = xstrlen( content ).
do len times.
n = sy-index - 1.
concatenate m000000 content+n(1) into idx in byte mode.
idx = ( crc bit-xor idx ) bit-and m000000ff.
idx = idx * 4.
x4 = crc32_map+idx(4).
crc = crc div 256. crc = crc bit-and m00ffffff. " c >> 8
crc = x4 bit-xor crc.
enddo.
crc = crc bit-xor mffffffff.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.