[ABAP] Binärdaten (HEX) in eine lokale Datei speichern

* HEX-Daten (Beispiel)
DATA(it_solix) = VALUE solix_tab(
                   ( line = '7639BD' )
                   ( line = '67326F' )
                 ).

TRY.
    DATA: lv_action TYPE i.
    DATA: lv_filename TYPE string.
    DATA: lv_fullpath TYPE string.
    DATA: lv_path TYPE string.

* Save-Dialog
    cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                  default_file_name = 'Data.bin'
                                                  default_extension = 'bin'
                                                  file_filter       = |Binärdaten (*.bin)\|*.bin\|{ cl_gui_frontend_services=>filetype_all }|
                                                CHANGING
                                                  filename          = lv_filename
                                                  path              = lv_path
                                                  fullpath          = lv_fullpath
                                                  user_action       = lv_action ).

    IF lv_action EQ cl_gui_frontend_services=>action_ok.
* XSTRING für Längenbestimung erzeugen
      DATA(lv_xstring) = cl_bcs_convert=>solix_to_xstring( it_solix ).

* Datei lokal speichern
      cl_gui_frontend_services=>gui_download( EXPORTING
                                                filename     = lv_fullpath
                                                filetype     = 'BIN'
                                                bin_filesize = xstrlen( lv_xstring )
                                              CHANGING
                                                data_tab     = it_solix ).

    ENDIF.
  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'I'.
ENDTRY.

[ABAP] Prüfen, ob eine Datei in UTF-8 codiert ist

PARAMETERS: p_file TYPE string DEFAULT '/usr/sap/tmp/testmara.csv' .

START-OF-SELECTION.
  TRY.
      DATA: lv_bom TYPE sychar01.
      DATA: lv_encoding TYPE sychar01.

      cl_abap_file_utilities=>check_utf8( EXPORTING file_name = p_file
                                          IMPORTING bom       = lv_bom
                                                    encoding  = lv_encoding ).

      CASE lv_bom.
        WHEN cl_abap_file_utilities=>no_bom.
          WRITE: / 'no_bom'.
        WHEN cl_abap_file_utilities=>bom_utf8.
          WRITE: / 'bom_utf8'.
        WHEN cl_abap_file_utilities=>bom_utf16_be.
          WRITE: / 'bom_utf16_be'.
        WHEN cl_abap_file_utilities=>bom_utf16_le.
          WRITE: / 'bom_utf16_le'.
      ENDCASE.

      CASE lv_encoding.
        WHEN cl_abap_file_utilities=>encoding_utf8.
          WRITE: / 'encoding_utf8'.
        WHEN cl_abap_file_utilities=>encoding_7bit_ascii.
          WRITE: / 'encoding_7bit_ascii'.
        WHEN cl_abap_file_utilities=>encoding_other.
          WRITE: / 'encoding_other'.
      ENDCASE.

    CATCH cx_root INTO DATA(e_txt).
      WRITE: / e_txt->get_text( ).
  ENDTRY.

[ABAP] Anhand eines logischen Dateinamens einen physischen Dateinamen vergeben

* https://www.consolut.com/s/sap-ides-zugriff/d/e/doc/E-FILE_GET_NAME/

* SF01 (Dateinamen mandantenabhängig)
* SF07 (Dateinamenanalyse)
* FILE (Dateinamen/pfade mandantenunabhängig)

* logischer Dateipfad und Dateiname, definiert in Transaktion FILE
DATA: lv_logical_filename TYPE filename-fileintern VALUE 'Z_MY_LOGIC_FILE_DEF'.
* Zusammengesetzter Dateiname aus lv_logical_filename und Parametern (Verwendung der Parameter siehe Transaktion FILE)
DATA: lv_file_name TYPE rlgrap-filename.
DATA: lv_file_format TYPE filename-fileformat.

* Anhand eines logischen Dateinamens den physischen Dateinamen vergeben
CALL FUNCTION 'FILE_GET_NAME'
  EXPORTING
    logical_filename = lv_logical_filename
    parameter_1      = sy-sysid
    parameter_2      = 'outputfilename.txt'
  IMPORTING
    file_name        = lv_file_name
    file_format      = lv_file_format
  exceptions
    file_not_found   = 1
    OTHERS           = 2.

IF sy-subrc = 0.
  WRITE: / lv_file_name.
  WRITE: / lv_file_format.
ENDIF.

[ABAP] Datei binär auf den Applikationsserver schreiben

Variante 1 (xstring)

* Dateiinhalt (Binärdatenstrom) als xstring
DATA(lv_bytes_xstr) = CONV xstring( 'A0B0C0' ).
* Pfad + Dateiname auf dem Appl.-Server
DATA(lv_file) = '/usr/sap/tmp/file.bin'.

TRY.
* Datei zum binären Schreiben öffnen
    OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE.
    IF sy-subrc = 0.

* Binärdaten in die Datei schreiben
      TRANSFER lv_bytes_xstr TO lv_file.

* Datei schließen
      CLOSE DATASET lv_file.
    ELSE.
      WRITE: / 'Konnte Datei nicht öffnen:', lv_file.
    ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 2 (itab mit Zeilen von 1024Bytes Länge)

TYPES: ty_raw1024 TYPE x LENGTH 1024.

* itab mit Zeilen von je 1kB Daten
DATA: it_raw1024 TYPE STANDARD TABLE OF ty_raw1024 WITH DEFAULT KEY.

* 2kB Testdaten erzeugen
it_raw1024 = VALUE #(
                      ( CONV xstring( 'A0B0C0FFFF' ) )
                      ( CONV xstring( 'C1D2E3FFFF' ) )
                    ).

* Pfad + Dateiname auf dem Appl.-Server
DATA(lv_file) = '/usr/sap/tmp/file.bin'.

TRY.
* Datei zum binären Schreiben öffnen
    OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE.
    IF sy-subrc = 0.

* Binärdaten Zeilenweise in die Datei schreiben
* es wird immer die volle Zeilenlänge geschrieben
      LOOP AT it_raw1024 ASSIGNING FIELD-SYMBOL(<x>).
        TRANSFER <x> TO lv_file.
      ENDLOOP.

* Datei schließen
      CLOSE DATASET lv_file.
    ELSE.
      WRITE: / 'Konnte Datei nicht öffnen:', lv_file.
    ENDIF.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Byte Order Mark (BOM) einer Datei auf dem Applikationsserver ermitteln

TRY.
    DATA(lv_file) = '/usr/sap/tmp/file.txt'.

    CASE cl_abap_file_utilities=>check_for_bom( lv_file ).
      WHEN cl_abap_file_utilities=>bom_utf8.
        WRITE: / 'UTF8'.
      WHEN cl_abap_file_utilities=>bom_utf16_le.
        WRITE: / 'UTF16_LE'.
      WHEN cl_abap_file_utilities=>bom_utf16_be.
        WRITE: / 'UTF16_BE'.
      WHEN cl_abap_file_utilities=>no_bom.
        WRITE: / 'No BOM'.
    ENDCASE.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Datei zw. Verzeichnissen des Appl.-Servers kopieren

PARAMETERS: p_s_file TYPE EPSFILNAM OBLIGATORY. " Quelldatei
PARAMETERS: p_s_dir  TYPE EPSDIRNAM OBLIGATORY. " Quelldirectory
PARAMETERS: p_t_file TYPE EPSFILNAM OBLIGATORY. " Zieldatei
PARAMETERS: p_t_dir  TYPE EPSDIRNAM OBLIGATORY. " Zieldirectory

START-OF-SELECTION.

  cl_cts_language_file_io=>copy_files_local( EXPORTING
                                               im_source_file           = p_s_file
                                               im_source_directory      = p_s_dir
                                               im_target_file           = p_t_file
                                               im_target_directory      = p_t_dir
                                               im_overwrite_mode        = 'F'
                                             EXCEPTIONS
                                               open_input_file_failed   = 1
                                               open_output_file_failed  = 2
                                               write_block_failed       = 3
                                               read_block_failed        = 4
                                               close_output_file_failed = 5
                                               OTHERS                   = 6 ).

  IF sy-subrc NE 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

[ABAP] UNIX-Pfad und -Dateinamen vom Applikationsserver aufsplitten

DATA: lv_file TYPE string VALUE '/usr/sap/test.txt'.
DATA: lv_name TYPE string.
DATA: lv_path TYPE string.

CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH'
  EXPORTING
    full_name     = lv_file
  IMPORTING
    stripped_name = lv_name
    file_path     = lv_path
  EXCEPTIONS
    x_error       = 1
    OTHERS        = 2.
    
IF sy-subrc = 0.
  WRITE: / lv_path.
  WRITE: / lv_name.
ENDIF.