服務器文件管理程序

此程序用於管理服務器上的文件,程序中定義了一些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
 

發佈了58 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章