Меню

Определение размера файла на application server SAP NetWeaver

|

Есть несколько способов определения размеров файлов, которые так или иначе сводятся к 4 способам.

← Предыдущий пост

Способ 1 (самый медленный и неэкономный по памяти).

Для определения размера файла можно прочитать весь файл и посчитать его размер через xstrlen.

DATA lv_file_size_all TYPE syindex.
    DATA lv_file_size_part TYPE syindex.
    DATA lv_file_bin TYPE xstring.
    DATA lv_file_bin_part TYPE xstring.


    OPEN DATASET mv_path2file FOR INPUT IN BINARY MODE.
    IF sy-subrc EQ 0.
      DO.
        READ DATASET mv_path2file INTO lv_file_bin_part.
        IF sy-subrc EQ 0.
          IF lv_file_bin IS INITIAL.
            lv_file_bin = lv_file_bin_part.
          ELSE.
            lv_file_bin = lv_file_bin && lv_file_bin_part.
          ENDIF.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
      CLOSE DATASET mv_path2file.
      lv_file_size_all = xstrlen( lv_file_bin ).
    ELSE.
      MESSAGE i000(cl) WITH 'file ' mv_path2file ' does not exist'.
    ENDIF.

    rv = lv_file_size_all.

Способ 2 (также медленный, но экономный по памяти).

Читаем файл по строкам, но фиксируем только длину строки через дополнение ACTUAL SIZE к READ DATASET.

    DATA lv_file_size_all TYPE syindex.
    DATA lv_file_size_part TYPE syindex.
    DATA lv_file_bin TYPE xstring.
    DATA lv_file_bin_part TYPE xstring.

    lv_file_size_all = 0.
    OPEN DATASET mv_path2file FOR INPUT IN BINARY MODE.
    IF sy-subrc EQ 0.
      DO.
        READ DATASET mv_path2file INTO lv_file_bin_part ACTUAL LENGTH lv_file_size_part.
        IF sy-subrc EQ 0.
          IF lv_file_size_all IS INITIAL.
            lv_file_size_all = lv_file_size_part.
          ELSE.
            lv_file_size_all = lv_file_size_all + lv_file_size_part.
          ENDIF.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.
      CLOSE DATASET mv_path2file.
    ENDIF.

    rv = lv_file_size_all.

Способ 3 (экономный по памяти, через команду операционной системы; если базис/регламент позволяет).

Имеется транзакция SM49 (настройка команд на уровне операционной системы); предопределенные команды операционной системы можно запускать через функциональный модуль SXPG_COMMAND_EXECUTE.

Как правило, в SAP NetWeaver есть предопределенная команда WWI_GET_DIR или DIR (нужно смотреть SM49).

Команда выводит список файлов из директории, но указав доп.параметры (указаны в таблице), можно получить и размер. Опции могут отличаться взависимости от операционной системы, но, как правило, любая операционная система такую информацию может предоставить.

Пример вызова

Для UNIX/Linux A4H.

Скрин SM49:

Результат:

DATA lv_trg_folder TYPE string VALUE '/usr/sap/A4H/D00/work/'.
    DATA lv_filepath_dataset_name TYPE string.

    DATA lv_command_in_sm49 TYPE sxpglogcmd VALUE 'DIR'.
    DATA lv_command_add_params TYPE btcxpgpar.
    DATA lv_oper_sys_as_in_sm49 TYPE syopsys VALUE 'UNIX'.
    DATA lt_exec_protocoll TYPE STANDARD TABLE OF btcxpm.

    DATA lt_stdout_comm TYPE STANDARD TABLE OF string.
    DATA lv_file_size_all TYPE syindex.
    DATA ls_ext_status TYPE extcmdexex.
    FIELD-SYMBOLS <fs_stdout_comm> TYPE string.

    lv_filepath_dataset_name = lv_trg_folder && mv_path2file.

    lv_command_add_params = lv_filepath_dataset_name && ` ` && '-ls1'.

    CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
      EXPORTING
        commandname                   = lv_command_in_sm49
        additional_parameters         = lv_command_add_params
        operatingsystem               = lv_oper_sys_as_in_sm49
*       targetsystem                  = SY-HOST
*       destination                   =
*       stdout                        = 'X'
*       stderr                        = 'X'
*       terminationwait               = 'X'
*       trace                         =
*       dialog                        =
 

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти