所以我尝试了 EPS2_GET_DIRECTORY_LISTING 和 EPS_GET_DIRECTORY_LISTING。 但问题是,在该函数内部,有一个检查来验证用户是否具有传输所需的权限。执行的检查是函数“TR_AUTHORITY_CHECK_DISPLAY”。
我不知道它与文件权限有什么关系......
我开始挖掘。结果在注释https://me.sap.com/notes/0003221036中写道,该函数不应该再使用,因为它失去了支持。但他们没有指定替代者。
您对我在这里可能使用的东西有什么建议吗? 我使用路径和 file_mask 调用该函数,因此替换也需要具有这种可能性。
要么,或者有人可以向我解释我需要传输权才能使用该功能。
当然,最简单的解决方案是复制功能模块并根据需要调整代码。
否则,如果您不想依赖非官方解决方案,我知道使用服务器文件系统的唯一方法是使用事务代码
SM49
和功能模块SXPG_COMMAND_EXECUTE
,它们旨在直接运行服务器上的命令。
例如,您可以在
SM49
中创建一个“服务器命令”(例如 ZGET_DIRECTORY
),并使用 ls
(对于 UNIX 类系统)、cmd /c dir
(对于 Windows 等)进行配置。
您可以通过调用
ZGET_DIRECTORY
来调用命令 SXPG_COMMAND_EXECUTE
,并将结果转换为接近 EPS2_GET_DIRECTORY_LISTING
的结果,以减少使用 EPS2_GET_DIRECTORY_LISTING
自定义程序的调整次数。
SM49
和ABAP代码示例:
DATA exec_protocol TYPE TABLE OF btcxpm.
DATA status TYPE extcmdexex-status.
DATA exitcode TYPE extcmdexex-exitcode.
DATA(directory) = CONV sxpgcolist-parameters( '/tmp' ).
DATA(host) = CONV rfcdisplay-rfchost( sy-host ).
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING commandname = 'ZGET_DIRECTORY'
additional_parameters = directory
operatingsystem = sy-opsys
targetsystem = host
IMPORTING status = status
exitcode = exitcode
TABLES exec_protocol = exec_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
OTHERS = 15.
IF sy-subrc <> 0 OR status = 'E'.
" handle the error
ELSE.
CASE sy-opsys.
WHEN 'UNIX' OR 'Linux'.
" Convert the output of "ls -la" into EPS2FILI format
" https://man7.org/linux/man-pages/man1/ls.1.html
TYPES output_eps2_get_directory_list TYPE STANDARD TABLE OF eps2fili WITH EMPTY KEY.
" -rw-rw---- 1 l4xadm sapsys 317674 2024-11-04 15:24:30.297148558 +0000 ABAON-BA
" https://unix.stackexchange.com/questions/103114/what-do-the-fields-in-ls-al-output-mean
TYPES:
BEGIN OF ls_output_fields,
file_type_mode TYPE c LENGTH 10, " type of entry - (file), d (directory), s (system), etc. + rwxrwxrwx
count_hard_links TYPE c LENGTH 4,
owner_name TYPE c LENGTH 8,
owner_group TYPE c LENGTH 8,
size_bytes TYPE string,
last_modif_date_iso TYPE string,
file_name TYPE c LENGTH 200, " possibly truncated
END OF ls_output_fields.
TYPES formatted_ls_output TYPE STANDARD TABLE OF ls_output_fields WITH EMPTY KEY.
" Delete the "total" line
DELETE exec_protocol INDEX 1.
DATA(output_eps2_get_directory_list) = VALUE output_eps2_get_directory_list( ).
LOOP AT exec_protocol REFERENCE INTO DATA(exec_output_line).
DATA(ls_output_fields) = VALUE ls_output_fields( ).
FIND REGEX '^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+\s+\S+\s+\S+)\s+(.*)$' ##REGEX_POSIX
IN exec_output_line->message
SUBMATCHES
ls_output_fields-file_type_mode
ls_output_fields-count_hard_links
ls_output_fields-owner_name
ls_output_fields-owner_group
ls_output_fields-size_bytes
ls_output_fields-last_modif_date_iso
ls_output_fields-file_name.
IF '-' = substring( val = ls_output_fields-file_type_mode
len = 1 ).
INSERT VALUE eps2fili( name = ls_output_fields-file_name
size = ls_output_fields-size_bytes
mtim = CONV #( ls_output_fields-last_modif_date_iso )
owner = ls_output_fields-owner_name )
INTO TABLE output_eps2_get_directory_list.
ENDIF.
ENDLOOP.
ENDCASE.
SORT output_eps2_get_directory_list BY name.
ENDIF.
注意:
SM69
是 SM49
的别名。