如何从目录中读取文件?

问题描述 投票:0回答:1

所以我尝试了 EPS2_GET_DIRECTORY_LISTING 和 EPS_GET_DIRECTORY_LISTING。 但问题是,在该函数内部,有一个检查来验证用户是否具有传输所需的权限。执行的检查是函数“TR_AUTHORITY_CHECK_DISPLAY”。

我不知道它与文件权限有什么关系......

我开始挖掘。结果在注释https://me.sap.com/notes/0003221036中写道,该函数不应该再使用,因为它失去了支持。但他们没有指定替代者。

您对我在这里可能使用的东西有什么建议吗? 我使用路径和 file_mask 调用该函数,因此替换也需要具有这种可能性。

要么,或者有人可以向我解释我需要传输权才能使用该功能。

function abap
1个回答
0
投票

当然,最简单的解决方案是复制功能模块并根据需要调整代码。

否则,如果您不想依赖非官方解决方案,我知道使用服务器文件系统的唯一方法是使用事务代码

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代码示例:

SM49 ls -la Linux command

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
的别名。

© www.soinside.com 2019 - 2024. All rights reserved.