此程序用于管理服务器上的文件,程序中定义了一些okcode命令,可以通过新增GUI状态来调用,也可以直接在TCODE命令框里输入命令直接调用。
清单如下:
CREA UTDL COPY UTUL RENA DELE STRT EXT
创建 下载 复制 上传 重命名 删除 执行命 退出
DATA: curr_dir(60) VALUE '/usr/sap/<SID>',
user_root(60) VALUE '/',
path(128),
pathwr(128),
t_sec(5) TYPE p,
flen TYPE p,
com(160),
file_name(100),
len TYPE i,
line_pick,
disp,
msg(80),
pos TYPE i,
sys_auth,
answer,
* edit,
txt(1024) OCCURS 100 WITH HEADER LINE.
DATA: BEGIN OF file,
dir(100),
name(100),
typ(10),
owner(8),
mode(3),
len(6) TYPE p,
mod_date TYPE d,
mod_time(8),
mtime(6) TYPE p,
END OF file.
DATA: file_list LIKE file OCCURS 10 WITH HEADER LINE.
*
START-OF-SELECTION.
* PERFORM set_status USING 'LIST'. "Del by btz 20050525 去掉 Application Toolbar
* PERFORM authority_check.
PERFORM timesone.
REPLACE '<SID>' WITH sy-sysid INTO curr_dir.
PERFORM show_directory USING curr_dir.
*
AT LINE-SELECTION.
sy-lsind = 1.
CONCATENATE curr_dir file_name INTO path SEPARATED BY '/'.
IF line_pick = 'D'.
PERFORM show_directory USING path.
* ELSEIF line_pick = 'F'.
* PERFORM show_file USING path.
ENDIF.
*
AT USER-COMMAND.
CONCATENATE curr_dir file_name INTO path SEPARATED BY '/'.
CASE sy-ucomm.
WHEN 'COPY' OR 'UTDL' OR 'RENA' OR 'DELE'.
IF line_pick IS INITIAL.
MESSAGE e333 WITH '大哥,选择一个行先~'.
ENDIF.
ENDCASE.
CASE sy-ucomm.
WHEN 'CREA'. PERFORM create_file USING curr_dir.
WHEN 'COPY'. PERFORM copy_file USING path curr_dir.
WHEN 'RENA'. PERFORM rename_file USING path curr_dir.
WHEN 'DELE'. PERFORM delete_file USING path.
WHEN 'UTDL'. PERFORM down_file USING path file_name .
WHEN 'UTUL'. PERFORM uppl_file USING curr_dir .
WHEN 'STRT'. PERFORM start_file USING path. EXIT.
WHEN 'EXT' .LEAVE PROGRAM .
ENDCASE.
PERFORM show_directory USING curr_dir. REFRESH txt.
* FORM show_directory
FORM show_directory USING dirname.
PERFORM check_punkt CHANGING dirname.
REPLACE '//' WITH '/' INTO dirname. curr_dir = dirname.
PERFORM page_header.
PERFORM fill_file_list USING dirname.
DELETE file_list WHERE name = space. CLEAR len.
LOOP AT file_list.
file_name = file_list-name.
IF dirname = user_root.
CHECK file_name(3) <> '. '.
ENDIF.
CHECK file_name(3) <> '.. '.
IF file_list-typ(1) = 'd' OR file_list-typ(1) = 'D'.
line_pick = 'D'.
FORMAT COLOR COL_KEY.
FORMAT HOTSPOT ON.
ELSE.
line_pick = 'F'.
flen = file_list-len.
FORMAT COLOR COL_NORMAL.
FORMAT HOTSPOT OFF.
ENDIF.
WRITE: / file_list-typ(1),
file_list-mode,
file_list-owner,
file_list-len NO-SIGN,
file_list-mod_date DD/MM/YY,
file_list-mod_time, ' ',
file_name.
HIDE: curr_dir, file_name, line_pick, flen.
ADD 1 TO len.
ENDLOOP.
CLEAR line_pick. SKIP 1.
FORMAT COLOR COL_BACKGROUND.
ULINE. WRITE: /(5) len NO-SIGN, 'lines'. ULINE.
FORMAT COLOR OFF.
ENDFORM. "show_directory
* Form COPY_FILE
FORM copy_file USING file_path dr.
IF sys_auth NE space. MESSAGE e333 WITH '访问被拒绝!'. ENDIF.
PERFORM get_name USING 'File Copy' 'new name:' dr CHANGING pathwr.
CHECK pathwr NE space.
CONCATENATE 'cp' file_path pathwr INTO com SEPARATED BY space.
PERFORM call_system.
ENDFORM. " COPY_FILE
* FORM CREATE_FILE
FORM create_file USING dr.
IF sys_auth NE space. MESSAGE e333 WITH '访问被拒绝'. ENDIF.
PERFORM get_name USING 'File Create' 'new name:' dr CHANGING pathwr.
CHECK pathwr NE space.
CONCATENATE 'touch' pathwr INTO com SEPARATED BY space.
PERFORM call_system.
ENDFORM. "create_file
* Form RENAME_FILE
FORM rename_file USING file_path dr.
IF sys_auth NE space. MESSAGE e333 WITH '访问被拒绝'. ENDIF.
PERFORM get_name USING 'File Rename' 'new name:' dr CHANGING pathwr.
CHECK pathwr NE space.
CONCATENATE 'mv' file_path pathwr INTO com SEPARATED BY space.
PERFORM call_system.
ENDFORM. " RENAME_FILE
* FORM DELETE_FILE
FORM delete_file USING path.
PERFORM file_check USING path.
CONCATENATE '删除' file_name '?' INTO msg SEPARATED BY space.
PERFORM confirm USING '删除服务器文件' msg '确定要删除?' 'N' .
CHECK answer = 'Y' OR answer = 'J'.
DELETE DATASET path.
IF sy-subrc NE 0. MESSAGE e333 WITH ' 删除时发生错误' path. ENDIF.
ENDFORM. "DELETE_FILE
* FORM FILL_FILE_LIST
FORM fill_file_list USING a_dir.
CLEAR file_list. REFRESH file_list. CLEAR len.
CALL 'C_DIR_READ_FINISH'. " just to be sure
CALL 'C_DIR_READ_START'
ID 'DIR' FIELD a_dir
ID 'FILE' FIELD '*'.
IF sy-subrc NE 0.
MESSAGE s333 WITH '读取错误' a_dir.
ENDIF.
DO.
CLEAR file.
CALL 'C_DIR_READ_NEXT'
ID 'TYPE' FIELD file-typ
ID 'NAME' FIELD file-name
ID 'LEN' FIELD file-len
ID 'OWNER' FIELD file-owner
ID 'MTIME' FIELD file-mtime
ID 'MODE' FIELD file-mode.
CASE sy-subrc.
WHEN 0.
WHEN 1.
EXIT.
WHEN OTHERS. " SY-SUBRC >= 2
ADD 1 TO len.
IF len > 10. EXIT. ENDIF.
ENDCASE.
CHECK file-typ(1) CO 'fFdD'.
PERFORM p6_to_date_time USING file-mtime
t_sec file-mod_time file-mod_date.
MOVE-CORRESPONDING file TO file_list.
file_list-dir = a_dir.
APPEND file_list.
ENDDO.
SORT file_list BY typ name ASCENDING.
ENDFORM. "FILL_FILE_LIST
* FORM PAGE_HEADER
FORM page_header.
CHECK disp = space.
ULINE.
WRITE: / '当前目录:', (70) curr_dir. ULINE.
WRITE:/'T','Mod',7 'Owner',22 'Size',29 'Date',38 'Time',49 'FileName'.
ULINE.
ENDFORM. "PAGE_HEADER
* Form DOWN_FILE
FORM down_file USING p_path file_name .
DATA: path LIKE rcgfiletr-ftappl .
DATA: localfile LIKE rcgfiletr-ftfront.
path = p_path .
localfile = file_name .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = localfile
def_path = 'C:/'
* MASK = ' '
mode = 'S'
title = '要保存的文件名'
IMPORTING
filename = localfile
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5
.
IF sy-subrc <> 0.
EXIT .
ENDIF.
PERFORM confirm USING '选择模式' '输出文件格式' '使用二进制模式么? 选择“否”使用文本模式。' 'Y' .
IF answer = 'J' OR answer = 'Y' .
CALL FUNCTION 'C13Z_FILE_DOWNLOAD_BINARY'
EXPORTING
i_file_front_end = localfile
i_file_appl = path
i_file_overwrite = 'X'
EXCEPTIONS
fe_file_open_error = 1
fe_file_exists = 2
fe_file_write_error = 3
ap_no_authority = 4
ap_file_open_error = 5
ap_file_empty = 6
OTHERS = 7.
IF sy-subrc <> 0.
IF sy-msgty = '' .
sy-msgty = 'E' .
ENDIF .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ELSE .
CALL FUNCTION 'C13Z_FILE_DOWNLOAD_ASCII'
EXPORTING
i_file_front_end = localfile
i_file_appl = path
i_file_overwrite = 'X'
EXCEPTIONS
fe_file_open_error = 1
fe_file_exists = 2
fe_file_write_error = 3
ap_no_authority = 4
ap_file_open_error = 5
ap_file_empty = 6
OTHERS = 7.
IF sy-subrc <> 0.
IF sy-msgty = '' .
sy-msgty = 'E' .
ENDIF .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
ENDFORM. " DOWN_FILE
* Form UPPL_FILE
FORM uppl_file USING dr.
DATA : q_extension LIKE dbmsgora-filename ,
q_name LIKE dbmsgora-filename ,
q_filename LIKE dbmsgora-filename ,
q_fwithext LIKE dbmsgora-filename .
DATA : c_file_front_end LIKE rcgfiletr-ftfront,
c_i_file_appl LIKE rcgfiletr-ftappl .
DATA : ans TYPE c .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mode = 'O'
title = '选择要上船的文件'
IMPORTING
filename = file_name
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0 .
EXIT .
ENDIF .
q_filename = file_name .
CALL FUNCTION 'Z_MYSPLITFILENAME'
EXPORTING
long_filename = q_filename
IMPORTING
filename = q_name
extension = q_extension
fullfilename = q_fwithext.
c_file_front_end = file_name .
c_i_file_appl = q_fwithext .
* open the file on the application server for reading to check if the
* file exists on the application server
CONCATENATE dr '/' c_i_file_appl INTO c_i_file_appl .
OPEN DATASET c_i_file_appl FOR INPUT IN BINARY MODE.
IF sy-subrc <> 8.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = '文件已经存在'
text_question = '文件已经存在,覆盖么?'
IMPORTING
answer = ans. "1、 2、 A
IF ans <> '1' .
CLOSE DATASET c_i_file_appl.
EXIT .
ENDIF .
ENDIF.
CLOSE DATASET c_i_file_appl.
CALL FUNCTION 'C13Z_FILE_UPLOAD_BINARY'
EXPORTING
i_file_front_end = c_file_front_end
i_file_appl = c_i_file_appl
i_file_overwrite = 'X'
EXCEPTIONS
fe_file_not_exists = 1
fe_file_read_error = 2
ap_no_authority = 3
ap_file_open_error = 4
ap_file_exists = 5
OTHERS = 6.
IF sy-subrc <> 0.
CASE sy-subrc .
WHEN 1 .
MESSAGE '本地文件不存在!' TYPE 'I' .
WHEN 2 .
MESSAGE '读取本地文件出错!' TYPE 'I' .
WHEN 3 .
MESSAGE '服务器权限错误!' TYPE 'I' .
WHEN 4 .
MESSAGE '服务器文件打开错误!' TYPE 'I' .
WHEN 5 .
MESSAGE '服务器文件已经存在!' TYPE 'I' .
WHEN 6 .
MESSAGE '其他错误!' TYPE 'I' .
ENDCASE .
ELSE .
MESSAGE 'SUCCESS!' TYPE 'I' .
ENDIF.
ENDFORM. " UPPL_FILE
* Form CHECK_PUNKT
FORM check_punkt CHANGING rdir.
DATA: bc(2), hp(128).
CONDENSE rdir NO-GAPS.
hp = rdir.
len = STRLEN( hp ).
CHECK len > 2.
len = len - 2.
bc = hp+len(2).
IF bc = '/.'.
hp = hp(len).
DO.
len = STRLEN( hp ).
len = len - 1.
bc(1) = hp+len(1).
IF len > 1.
hp = hp(len).
ELSE.
rdir = '/'.
EXIT.
ENDIF.
IF bc(1) = '/'.
rdir = hp.
EXIT.
ENDIF.
ENDDO.
ENDIF.
ENDFORM. " CHECK_PUNKT
* Form TIMESONE
FORM timesone.
CALL 'C_GET_TIMEZONE'
ID 'SEC' FIELD t_sec.
t_sec = 0 - sy-tzone.
IF sy-dayst = 'X'.
SUBTRACT 3600 FROM t_sec.
ENDIF.
ENDFORM. " TIMESONE
* Form AUTHORITY_CHECK
FORM authority_check.
AUTHORITY-CHECK OBJECT 'S_C_FUNCT'
ID 'PROGRAM' FIELD sy-repid
ID 'ACTVT' FIELD '16'
ID 'CFUNCNAME' FIELD 'C_DIR_READ_START'.
IF sy-subrc NE 0.
MESSAGE a333 WITH '抱歉,你没有运行这个程序的权限!'.
ENDIF.
AUTHORITY-CHECK OBJECT 'S_C_FUNCT'
ID 'PROGRAM' FIELD sy-repid
ID 'ACTVT' FIELD '16'
ID 'CFUNCNAME' FIELD 'SYSTEM'.
IF sy-subrc NE 0.
sys_auth = 'X'.
ENDIF.
ENDFORM. " AUTHORITY_CHECK
* Form SET_STATUS
FORM set_status USING status.
DATA: prog LIKE sy-repid.
prog = sy-repid.
sy-lsind = 1.
CALL FUNCTION 'RS_CUA_INTERNAL_STATUS_CHECK'
EXPORTING
program = prog
status = status
IMPORTING
status_exists = answer.
IF answer = 'X'. SET PF-STATUS status IMMEDIATELY . ENDIF.
ENDFORM. " SET_STATUS
* Form START_FILE
FORM start_file USING fcom.
DATA: par(30),
tab(255) OCCURS 10 WITH HEADER LINE.
IF line_pick = 'F'.
PERFORM get_name USING 'Execute' 'with parameters:' ' ' CHANGING par.
ELSE.
PERFORM get_name USING 'Execute' 'command:' ' ' CHANGING par.
ENDIF.
com = par.
IF line_pick = 'F'.
CONCATENATE fcom par INTO com SEPARATED BY space.
ENDIF.
CALL 'SYSTEM'
ID 'COMMAND' FIELD com
ID 'TAB' FIELD tab-*sys*.
SET BLANK LINES ON.
FORMAT COLOR COL_TOTAL INTENSIFIED OFF.
disp = 'X'.
LOOP AT tab.
WRITE:/ tab.
ENDLOOP.
FORMAT COLOR COL_NORMAL.
CLEAR disp.
ENDFORM. " START_FILE
* Form GET_NAME
FORM get_name USING popup text1 dir CHANGING tdir.
DATA: new(30).
* IF sy-saprl(1) = '4'.
* SET PF-STATUS 'PT' OF PROGRAM 'SAPLSTXX' IMMEDIATELY.
* ENDIF.
CALL FUNCTION 'POPUP_TO_FILL_COMMAND_LINE'
EXPORTING
popuptitle = popup
text1 = text1
IMPORTING
command_line = new.
* PERFORM set_status USING 'LIST'.
IF new = space. CLEAR pathwr. EXIT. ENDIF.
IF dir = space. tdir = new. EXIT. ENDIF.
CONCATENATE dir new INTO tdir SEPARATED BY '/'.
OPEN DATASET tdir FOR INPUT IN TEXT MODE ENCODING DEFAULT .
IF sy-subrc = 0.
MESSAGE e333 WITH new 'already exists'.
CLOSE DATASET tdir.
ENDIF.
ENDFORM. " GET_NAME
* Form CONFIRM
FORM confirm USING titel textline1 textline2 defoption .
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
defaultoption = defoption
textline1 = textline1
textline2 = textline2
titel = titel
cancel_display = ' '
IMPORTING
answer = answer.
ENDFORM. " CONFIRM
* Form FILE_CHECK
FORM file_check USING path.
DATA: tmp_path(60), progname LIKE sy-repid.
tmp_path = path. progname = sy-repid.
AUTHORITY-CHECK OBJECT 'S_DATASET' ID 'PROGRAM' FIELD progname
ID 'ACTVT' FIELD '06' ID 'FILENAME' FIELD tmp_path.
IF sy-subrc NE 0. MESSAGE e333 WITH 'Permission denied'. ENDIF.
ENDFORM. " FILE_CHECK
* Form CALL_SYSTEM
FORM call_system.
DATA: tab(100) OCCURS 1 WITH HEADER LINE.
CALL 'SYSTEM'
ID 'COMMAND' FIELD com
ID 'TAB' FIELD tab-*sys*.
READ TABLE tab INDEX 1.
IF tab NE space. MESSAGE s333 WITH tab. ENDIF.
ENDFORM. " CALL_SYSTEM
* Form p6_to_date_time
FORM p6_to_date_time USING a13_sec_p6 a13_timezone_sec
a13_time a13_date.
* P6_TO_DATE_TIME - Convert a time stamp.
*
DATA: opcode TYPE x,
timestamp TYPE i,
timezone TYPE i,
tz LIKE sy-zonlo,
date TYPE d,
time TYPE t,
timestring(10),
abapstamp(14),
abaptstamp TYPE timestamp.
timestamp = a13_sec_p6.
opcode = 3.
CALL 'RstrDateConv'
ID 'OPCODE' FIELD opcode
ID 'TIMESTAMP' FIELD timestamp
ID 'ABAPSTAMP' FIELD abapstamp.
abaptstamp = abapstamp.
timezone = a13_timezone_sec / 3600.
IF timezone > 0.
WRITE timezone TO tz LEFT-JUSTIFIED.
CONCATENATE 'UTC-' tz INTO tz.
ELSEIF timezone < 0.
timezone = timezone * -1.
WRITE timezone TO tz LEFT-JUSTIFIED.
CONCATENATE 'UTC+' tz INTO tz.
ELSE.
tz = 'UTC'.
ENDIF.
CONVERT TIME STAMP abaptstamp TIME ZONE tz INTO DATE date
TIME time.
IF sy-subrc <> 0.
date = abapstamp(8).
time = abapstamp+8.
ENDIF.
WRITE: time(2) TO timestring(2),
':' TO timestring+2(1),
time+2(2) TO timestring+3(2),
':' TO timestring+5(1),
time+4(2) TO timestring+6(2).
MOVE timestring TO a13_time.
MOVE date TO a13_date.
ENDFORM. "P6_TO_DATE_TIME