[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] Datei vom Applikationsserver binär lesen

Variante 1 (xstring)

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

TRY.
* Datei zum binären Lesen öffnen
    OPEN DATASET lv_file FOR INPUT IN BINARY MODE.
    IF sy-subrc = 0.
* Daten bis Dateiende lesen
      READ DATASET lv_file INTO lv_bytes_xstr.

      IF sy-subrc = 0.
        WRITE: / xstrlen( lv_bytes_xstr ), 'bytes gelesen.'.
      ELSE.
        WRITE: / 'Fehler beim Lesen.'.
      ENDIF.

* 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 (byteweises Lesen in itab)

DATA: lv_byte TYPE x LENGTH 1.          " ein byte
DATA: it_file TYPE STANDARD TABLE OF x. " iTab mit Dateidaten
* Pfad + Dateiname auf dem Appl.-Server
DATA(lv_file) = '/usr/sap/tmp/file.bin'.

TRY.
* Datei zum binären Lesen öffnen
    OPEN DATASET lv_file FOR INPUT IN BINARY MODE.
    IF sy-subrc = 0.
* Daten bis Dateiende lesen
      DO.
* byteweise lesen
        READ DATASET lv_file INTO lv_byte.

        IF sy-subrc = 0.
* bytes an iTab anhängen, iTab kann anderweitig heruntergeladen werden
* z.B. mit cl_gui_frontend_services=>gui_download
          APPEND lv_byte TO it_file.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.

* 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] Prüfen, ob eine Datei auf dem Applikationsserver existiert (FileExists)

Variante 1 (OPEN DATASET, ohne Berechtigungsprüfung)

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

* Datei auf dem Appl.-Server vorhanden -> Datei testweise öffnen und prüfen
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT IGNORING CONVERSION ERRORS.

IF sy-subrc = 0.
  CLOSE DATASET lv_file.

  WRITE: / |File exists.|.
ELSE.
  WRITE: / |File doesn't exist.|.
ENDIF.

Variante 2 (PFL_CHECK_OS_FILE_EXISTENCE mit Berechtigungsprüfung für S_RZL_ADM ACTVT 01)

            
DATA: lv_file TYPE pfebackuppro VALUE '/usr/sap/tmp/file.txt'.
DATA: lv_exists TYPE abap_bool.

CALL FUNCTION 'PFL_CHECK_OS_FILE_EXISTENCE'
  EXPORTING
    long_filename         = lv_file
  IMPORTING
    file_exists           = lv_exists
  EXCEPTIONS
    authorization_missing = 1
    OTHERS                = 2.

IF sy-subrc = 0.
  IF lv_exists = abap_true.
    WRITE: / |File exists.|.
  ELSE.
    WRITE: / |File doesn't exist.|.
  ENDIF.
ELSE.
  WRITE: / 'Error:', sy-subrc.
ENDIF.

[ABAP] Dateien auf dem Applikationsserver lesen / schreiben / löschen

* http://sap4tech.net/handling-files-on-application-server-in-sap/
* http://abap-blog.ru/files/fajlovyj-interfejs-operacii-s-fajlami/

DATA: it_mara TYPE TABLE OF mara.
DATA: wa_mara LIKE LINE OF it_mara.
DATA: lv_string TYPE string.

PARAMETERS: p_file TYPE string DEFAULT '/usr/sap/tmp/testmara.csv' .
PARAMETERS: p_mtart TYPE mara-mtart DEFAULT 'DIEN'.

START-OF-SELECTION.
* Daten lesen
  SELECT * FROM mara INTO TABLE @it_mara UP TO 50 ROWS WHERE mtart = @p_mtart.

TRY.
* Datei im Textmode zum Schreiben öffnen
* In einem Unicode-System entspricht die Angabe DEFAULT der Angabe UTF-8 und in einem Nicht-Unicode-System der Angabe NON-UNICODE
    OPEN DATASET p_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 IGNORING CONVERSION ERRORS.

* Daten in die Datei schreiben
    LOOP AT it_mara INTO wa_mara .
      lv_string = |{ wa_mara-matnr };{ wa_mara-ersda };{ wa_mara-matkl }|.
      TRANSFER lv_string TO p_file.
    ENDLOOP.

* Datei schließen
    CLOSE DATASET p_file.

* Datei im Textmode zum lesen öffnen
* In einem Unicode-System entspricht die Angabe DEFAULT der Angabe UTF-8 und in einem Nicht-Unicode-System der Angabe NON-UNICODE
    OPEN DATASET p_file FOR INPUT IN TEXT MODE ENCODING UTF-8 IGNORING CONVERSION ERRORS.

* Daten lesen bis Dateiende
    DO.
      READ DATASET p_file INTO lv_string.
      IF sy-subrc <> 0.
        EXIT.
      ELSE.
        WRITE: / lv_string.
      ENDIF.
    ENDDO.

* Datei schließen
    CLOSE DATASET p_file.

* Datei löschen
    DELETE DATASET p_file.
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.