Dateien aus einem serverseitigen Zielverzeichnis löschen

Posten Sie hier Tutorials & Cookbooks.
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von ZUSE83 (ForumUser / 1 / 0 / 1 ) »
Mit diesem Report können Dateien aus einen Verzeichnis auf einem Systemserver gelöscht werden.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report Y_PM_DELETE_FILE
*&
*&---------------------------------------------------------------------*
*& Löscht Dateien aus einem Zielverzeichnis.
*&
*&
*&
*& Author     : ********
*& date       : **.**.****
*& kind of p. : Report    (x)     Batch-Input ( )      Include   ( )
*&              Sonstiges/others  ( )                  Modulpool   ( )
*&
*----------------------------------------------------------------------*
* Änderungshistorie                                                    *
* Datum      Benutzer:                  Grund                          *
* ---------- ----------------- --------------------------------------- *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
REPORT Y_PM_DELETE_FILE.

PARAMETERS: p_dir TYPE string LOWER CASE OBLIGATORY
            DEFAULT '/usr/sap/tmp/GR55_Report_Painter'
            VISIBLE LENGTH 80.

SELECTION-SCREEN BEGIN OF BLOCK file_block WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file1 TYPE string LOWER CASE VISIBLE LENGTH 40,
            p_file2 TYPE string LOWER CASE VISIBLE LENGTH 40,
            p_file3 TYPE string LOWER CASE VISIBLE LENGTH 40,
            p_file4 TYPE string LOWER CASE VISIBLE LENGTH 40,
            p_file5 TYPE string LOWER CASE VISIBLE LENGTH 40.
SELECTION-SCREEN END OF BLOCK file_block.

DATA: lv_fullpath TYPE string,
      lt_files    TYPE TABLE OF string,
      lv_file     TYPE string.

START-OF-SELECTION.

* Sammle alle eingegebenen Dateien
  IF p_file1 IS NOT INITIAL. APPEND p_file1 TO lt_files. ENDIF.
  IF p_file2 IS NOT INITIAL. APPEND p_file2 TO lt_files. ENDIF.
  IF p_file3 IS NOT INITIAL. APPEND p_file3 TO lt_files. ENDIF.
  IF p_file4 IS NOT INITIAL. APPEND p_file4 TO lt_files. ENDIF.
  IF p_file5 IS NOT INITIAL. APPEND p_file5 TO lt_files. ENDIF.

  IF lt_files IS INITIAL.
    MESSAGE 'Keine Dateien zum Löschen angegeben!' TYPE 'E'.
    RETURN.
  ENDIF.

* Für Server-Zugriff OPEN DATASET
  LOOP AT lt_files INTO lv_file.
    CONDENSE lv_file.
    CONCATENATE p_dir '/' lv_file INTO lv_fullpath.

    WRITE: / 'Prüfe Datei:', lv_fullpath.

    " Prüfen ob Datei existiert
    DATA(lv_exists) = abap_false.
    OPEN DATASET lv_fullpath FOR INPUT IN TEXT MODE ENCODING DEFAULT.
    IF sy-subrc = 0.
      lv_exists = abap_true.
      CLOSE DATASET lv_fullpath.
    ENDIF.

    IF lv_exists = abap_false.
      WRITE: / '➤ Datei nicht gefunden:', lv_fullpath.
      CONTINUE.
    ENDIF.

    " Datei löschen
    DELETE DATASET lv_fullpath.
    IF sy-subrc = 0.
      WRITE: / '✓ Datei erfolgreich gelöscht:', lv_file.
    ELSE.
      WRITE: / '✗ Fehler beim Löschen:', lv_file, 'Subrc:', sy-subrc.
    ENDIF.
    SKIP.
  ENDLOOP.

  WRITE: / 'Löschvorgang abgeschlossen.'.

Folgende Benutzer bedankten sich beim Autor ZUSE83 für den Beitrag:
Jan


gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von black_adept (Top Expert / 4149 / 133 / 958 ) »
Moin Zuse83,

ich würde die Parameter P_FILE1 - P_FILE5 durch eine SelOpt ersetzen, bei der nur Einzelwerte eingegeben werden können. Das macht das allgemeingültiger und du brauchst die Parameter dann auch nicht in eine Tabelle zum Abarbeiten überführen, sondern hast es durch die Selektionsoption schon zur Verfügung.

Und wenn ich es mir recht überlege scheint mir dein "CONDENSE" sehr mutig zu sein, da i.A. führende oder aufeinanderfolgende Leerzeichen in Dateinamen vielleicht nicht sonderlich sinnvoll aber durchaus erlaubt sind.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von fr-g (ForumUser / 77 / 12 / 25 ) »
Seltsamer Stilmix im Code 🤔
Gedanken, die mir kommen:
- directory traversal
- conversion errors beim Öffnen IN TEXT MODE
- das CONDENSE wundert mich auch etwas ^^

Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von msfox (Specialist / 400 / 61 / 78 ) »
fr-g hat geschrieben:
06.11.2025 12:19
Seltsamer Stilmix im Code 🤔
Gedanken, die mir kommen:
- ich konnte keinen Frage oder einen Nährwert finden.
Entscheidend ist der Befehl: "DELETE DATASET lv_fullpath."
Alles drum rum ist eine Speziallösung.
Gestern neu angemeldet und heute etwas Quellcode veröffentlicht. Macht das sonst nicht eigentlich bei github?
--
Ich hatte etwas ähnliches letztens beim Kunden. Dort sollte aber unbedingt über Systembefehle gelöscht werden. Da nütze mir DELETE DATASET also auch nix. Auch bestand bei mir die Anforderung, Dateien mit einem bestimmten Muster zu löschen. Dann wird's nämlich schwieriger, weil man erst das Verzeichnis lesen muss.

Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von IHe (Specialist / 169 / 38 / 57 ) »
msfox hat geschrieben:
06.11.2025 13:34
Gestern neu angemeldet und heute etwas Quellcode veröffentlicht. Macht das sonst nicht eigentlich bei github?
Dieser Bereich des Forums ist ja durchaus dafür da, um (Code-)Lösungen zu präsentieren und nicht um Fragen zu stellen. Die Einstiegshürde muss man dafür auch nicht zu hoch setzen, statt dessen würde ich mir hier einen konstruktiven und kollektiven Code-Review wünschen (wie hier bereits begonnen wurde) - daraus können alle viel mitnehmen.

Abseits des bisher bereits gesagten hätte ich noch folgende Anmerkungen:
- Man sollte sich auch bei kleinen Reports angewöhnen, mit einer lokalen Klasse zur besseren Strukturierung der Abläufe zu arbeiten (idealerweise bei Anlage bereits als Template/Muster hinterlegt)
- Um den Report allgemeiner zu halten wie bereits von Stefan erwähnt könnte man die Select-Options (anstelle der Parameter) neben Dateinamen noch auf Eigenschaften wie Erstellungs- und Änderungsdatum ausweiten. So können bspw. Verzeichnisse mit temporären Dateien automatisiert bereinigt werden, wenn die Dateien dort ein gewisses "Alter" erreicht haben
- Bis auf den ersten Fehlerfall wird mit WRITE protokolliert - das ist bei kritischen Löschvorgängen zu wenig. Selbst wenn man die Erstellung von Application Logs noch nicht in eigenen globalen Klassen vereinfacht nutzbar gemacht hat ist der Codeaufwand für den Einsatz überschaubar.
- Wenn man im Variablennamen die ungarischer Notation verwenden möchte, dann ist aber LV_ und LT_ nicht korrekt - das sind alles im Report global verfügbare Variablen bzw. Tabellen
Ingo Hoffmann

ECC|S/4HANA|BTP
dbh SAP Solutions

Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von DeathAndPain (Top Expert / 1991 / 270 / 418 ) »
Sehr viele Leute, die ungarische Notation verwenden, haben sie nur bedingt verstanden und schreiben ohne nachzudenken aus Prinzip vor jedes Feld lv_. Das wirft auch ein Schlaglicht auf die Bedeutung der ungarischen Notation, denn ich denke, selbst die Verfechter davon werden mir recht geben, dass falsche ungarische Notation schlechter ist als gar keine (da sie dann gezielt in die Irre führt).

Ansonsten:
  • Nach meiner Erinnerung führt eine TYPE 'E'-Message außerhalb von AT SELECTION SCREEN ON feldname dazu, dass alle Felder gesperrt sind und man den Fehler insofern nicht korrigieren kann, sondern das ganze Programm verlassen muss (womit der Inhalt aller anderen Felder, die man bereits ausgefüllt hat, natürlich auch verloren geht). Deswegen benutze ich TYPE E nur dort (bzw. bei Dynpro-PAIs für einzelne Feld- oder CHAIN-Prüfungen). In allen anderen Fällen schreibe ich lieber TYPE 'I' DISPLAY LIKE 'E'. Sieht optisch genauso aus, aber schikaniert nicht ohne Not den Benutzer.
  • && wäre wesentlich schöner gewesen als dieser CONCATENATE. Das mag nicht für alle CONCATENATEs gelten, aber für die meisten und ganz besonders für diesen.
  • Das Feld lv_exists entbehrt jeder Daseinsberechtigung. Stattdessen hätte er einfach das machen können, was er ohnehin zum befüllen von lv_exists gemacht hat: den SY-SUBRC auswerten. Ich hätte einfach direkt hinter dem OPEN DATASET

    Code: Alles auswählen.

    IF sy-subrc <> 0.
          WRITE: / '➤ Datei nicht gefunden:', lv_fullpath.
          CONTINUE.
    ENDIF.
    geschrieben und fertig. Der Teil mit dem CLOSE DATASET braucht nicht in einen IF-Block; der wäre einfach dahinter gekommen. Er wird ja infolge des CONTINUEs andernfalls ohnehin nicht erreicht.
    msfox hat geschrieben:Ich hatte etwas ähnliches letztens beim Kunden. Dort sollte aber unbedingt über Systembefehle gelöscht werden.
    Geisteskranke Anforderung. Du sollst Dateien per ABAP löschen, darfst aber nicht den Befehl benutzen, den ABAP dafür bereitstellt. Kunden gibt's...
    msfox hat geschrieben:Auch bestand bei mir die Anforderung, Dateien mit einem bestimmten Muster zu löschen. Dann wird's nämlich schwieriger, weil man erst das Verzeichnis lesen muss.
    Wirklich? Wenn Du eh den Aufwand treiben und einen Systembefehl benutzen musst, dann kannst Du Dir doch den Umstand zunutze machen, dass die Systembefehle Muster zu beherrschen pflegen. Unter Linux könntest Du z.B. einen rm -rf abc* absetzen.

Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von black_adept (Top Expert / 4149 / 133 / 958 ) »
DeathAndPain hat geschrieben:
07.11.2025 20:04
[...] denn ich denke, selbst die Verfechter davon werden mir recht geben, dass falsche ungarische Notation schlechter ist als gar keine (da sie dann gezielt in die Irre führt).
FULL ACK
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von Radinator (ForumUser / 86 / 13 / 7 ) »
DeathAndPain hat geschrieben:
07.11.2025 20:04
&& wäre wesentlich schöner gewesen als dieser CONCATENATE. Das mag nicht für alle CONCATENATEs gelten, aber für die meisten und ganz besonders für diesen.
Könntest du erläutern warum genau das Verwenden von CONCATENATE hier "unschön" ist?
Mein Gedanke hier wäre es mit String Interpolation zu arbeiten, also 2x die Pipes und darin dann die Variablen hintereinander zu packen.

Ansonsten hinsichtlich Verbesserungsvorschläge:
- https://help.sap.com/saphelp_ewm900/hel ... ameset.htm
- https://www.berater-wiki.de/Application_Log
- https://codezentrale.de/abap-system-applog-verwenden-2/
Hier findest du Codeschnipsel, mit welchen du dir ein Logging System für das Application Log (SLG1) zusammenbasteln kannst. Das noch schön in eine Klasse packen und du sparst dir das INCLUDEn ;)

Re: Dateien aus einem serverseitigen Zielverzeichnis löschen

Beitrag von DeathAndPain (Top Expert / 1991 / 270 / 418 ) »
Ja, genau.

Code: Alles auswählen.

lv_fullpath = p_dir && `/` && lv_file.
liest sich wesentlich besser (versteht man schneller ohne nachdenken zu müssen) als

Code: Alles auswählen.

CONCATENATE p_dir '/' lv_file INTO lv_fullpath.
Die dritte, von der SAP empfohlene Variante ist

Code: Alles auswählen.

lv_fullpath = |{p_dir}/{lv_file}|
(Hab ich schon so lange nicht mehr benutzt, dass ich aus der Erinnerung nicht mehr genau weiß, wo da ggf. Leerzeichen reinmüssen und bin grad zu faul das nachzuschlagen.) Ist eine etwas schräge Syntax, aber wenn man sie verstanden hat, sehr leicht zu lesen. Hat in meinen Augen gegenüber && dann Vorteile, wenn sehr viele Elemente miteinander verkettet werden müssen.

Seite 1 von 1

Vergleichbare Themen

15
Antw.
11190
Views
Archivierung von Dateien
von Mark33 » 21.08.2012 22:38 • Verfasst in ABAP® für Anfänger
0
Antw.
1684
Views
XML Dateien einlesen!
von Rabea1103 » 02.03.2009 11:32 • Verfasst in ABAP® Core
4
Antw.
2399
Views
Dateien senden
von cuncon » 04.04.2018 15:33 • Verfasst in ABAP® für Anfänger
2
Antw.
6063
Views
Dateien in SAP hochladen
von Monbebe » 22.03.2012 16:15 • Verfasst in ABAP® für Anfänger
3
Antw.
3403
Views
Laden von Dateien
von debianfan » 26.05.2017 15:08 • Verfasst in ABAP® für Anfänger

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.