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