Определение размера файла на 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
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти