项目上需要将附件上传得到ABAP AS的文件系统上,文件需要按照上传日期存放在 YYYY\MM对应的目录下,所以我们需要动态的创建文件夹,以应对不同月份的所需的新文件夹。以下便是使用ABAP在 AS上创建文件夹的code:
class ZCL_FILE_SYSTEM_UTIL definition
public
final
create public .
public section.
class-methods CHECK_DIRECTORY_EXIST
importing
!IV_DIR type STRING
returning
value(RV_EXIST) type ABAP_BOOL .
class-methods CREATE_DIRECTORY
importing
!IV_CREATE_DIR type STRING
returning
value(RV_SUCCESS) type ABAP_BOOL .
protected section.
private section.
types:
TY_SEPARATOR(1) type c .
class-data GC_SEPARATOR_SLASH type TY_SEPARATOR value '/' ##NO_TEXT.
class-data GC_SEPARATOR_BACKSLASH type TY_SEPARATOR value '\' ##NO_TEXT.
ENDCLASS.
CLASS ZCL_FILE_SYSTEM_UTIL IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_FILE_SYSTEM_UTIL=>CHECK_DIRECTORY_EXIST
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_DIR TYPE STRING
* | [<-()] RV_EXIST TYPE ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD check_directory_exist.
**********************************************************************
* 检查目录是否存在
**********************************************************************
DATA:lv_dir TYPE sxpgcolist-parameters,
lv_status TYPE extcmdexex-status,
lv_exitcode TYPE extcmdexex-exitcode,
lt_protocol TYPE TABLE OF btcxpm.
lv_dir = iv_dir.
* 调用SM69中定义的OS命令
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING
commandname = 'ZLS'
additional_parameters = lv_dir
IMPORTING
status = lv_status
exitcode = lv_exitcode
TABLES
exec_protocol = lt_protocol
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
wrong_check_call_interface = 5
program_start_error = 6
program_termination_error = 7
x_error = 8
parameter_expected = 9
too_many_parameters = 10
illegal_command = 11
wrong_asynchronous_parameters = 12
cant_enq_tbtco_entry = 13
jobcount_generation_error = 14.
IF sy-subrc EQ 0 AND lv_status EQ 'O' AND lv_exitcode EQ '0'.
rv_exist = abap_true.
ELSE.
rv_exist = abap_false.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_FILE_SYSTEM_UTIL=>CREATE_DIRECTORY
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_CREATE_DIR TYPE STRING
* | [<-()] RV_SUCCESS TYPE ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD create_directory.
**********************************************************************
* 在AS上创建目录
**********************************************************************
DATA:lv_dir TYPE string,
lv_para TYPE sxpgcolist-parameters,
lv_status TYPE extcmdexex-status,
lv_exitcode TYPE extcmdexex-exitcode,
lt_protocol TYPE TABLE OF btcxpm.
DATA:lv_separator TYPE string." 目录分隔符
DATA:lt_dir TYPE TABLE OF string.
IF check_directory_exist( iv_dir = iv_create_dir ) EQ abap_false." 目录不存在
* 判断分隔符
IF iv_create_dir CS gc_separator_slash.
lv_separator = gc_separator_slash.
ELSE.
lv_separator = gc_separator_backslash.
ENDIF.
* 逐级检查目录
SPLIT iv_create_dir AT lv_separator INTO TABLE lt_dir.
CLEAR lv_dir.
LOOP AT lt_dir INTO DATA(ls_dir).
IF ls_dir eq ''.
CONTINUE.
ENDIF.
lv_dir = |{ lv_dir }{ lv_separator }{ ls_dir }|.
* 检查目录是否存在
IF check_directory_exist( iv_dir = lv_dir ) EQ abap_false." 不存在,则创建
lv_para = lv_dir.
** 调用SM69中定义的 OS 命令
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING
commandname = 'ZMKDIR'
additional_parameters = lv_para
IMPORTING
status = lv_status
exitcode = lv_exitcode
TABLES
exec_protocol = lt_protocol
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
wrong_check_call_interface = 5
program_start_error = 6
program_termination_error = 7
x_error = 8
parameter_expected = 9
too_many_parameters = 10
illegal_command = 11
wrong_asynchronous_parameters = 12
cant_enq_tbtco_entry = 13
jobcount_generation_error = 14.
IF sy-subrc EQ 0 AND lv_status EQ 'O' AND lv_exitcode EQ '0'." 创建成功
ELSE." 创建失败
rv_success = abap_false.
EXIT.
ENDIF.
ELSE." 存在,则继续检查下级目录
ENDIF.
ENDLOOP.
IF sy-subrc EQ 0 AND lv_status EQ 'O' AND lv_exitcode EQ '0'.
rv_success = abap_true.
ELSE.
rv_success = abap_false.
ENDIF.
ELSE." 目录存在,直接返回成功
rv_success = abap_true.
ENDIF.
ENDMETHOD.
ENDCLASS.