Die Entwickler der IBM waren fleißig und haben mit jedem Technologie-Refresh neue Methoden eingebaut, um mit IFS und SQL zu arbeiten. Es lohnt sich, darüber bescheid zu wissen, weil es die Arbeit mit dem IFS viel einfacher macht.
- Lesen von IFS-Directories
- Lesen einer IFS-Datei
- Erstellen einer IFS-Datei
- Kopieren einer IFS-Datei
- Löschen einer IFS-Datei
1. Das Lesen von IFS-Directories mit IFS_OBJECT_STATISTICS
Aus meiner Sicht ist diese SQL-Funktion die einfachste Möglichkeit, viele Informationen aus den IFS-Verzeichnissen zu gewinnen. In Verbindung mit der SQL-Funktion IFS_UNLINK können beispielsweise alle Objekte in einem Verzeichnis gelöscht oder mit IFS_WRITE ganze Verzeichnisinhalte kopiert werden, die eine bestimmte Größe haben oder ein bestimmtes Alter.
Weitere Informationen zu diesen SQL-Funktionen finden Sie in den IBM i-Online-Handbüchern. Es lohnt sich die Seite www.rpgpgm.com zu besuchen, die weitere gute Beispiele bereit hält.
Achtung: Oft sind Pfadnamen mit Sonderzeichen versehen und dann fehlen diese in der Auflistung, deshalb der CAST für den Pfadnamen nach UTF8 = CCSID 1208.
SELECT CAST(PATH_NAME as varchar(128) CCSID 1208) AS PATH_NAME,
OBJECT_TYPE, TO_CHAR(DATA_SIZE, '999G999G999') AS "Size",
CREATE_TIMESTAMP, ACCESS_TIMESTAMP, DATA_CHANGE_TIMESTAMP,
OBJECT_CHANGE_TIMESTAMP
FROM TABLE(
QSYS2.IFS_OBJECT_STATISTICS(
START_PATH_NAME => '/home/export/test',
SUBTREE_DIRECTORIES => 'YES',
OBJECT_TYPE_LIST => '*ALLSTMF *ALLDIR'
)
)
ORDER BY PATH_NAME;
Ergebnis:

2. Das Lesen von IFS-Dateien
Hier gibt es drei verschiedene Möglichkeiten, den Inhalt einer Datei zu lesen. Mit den ersten beiden Statements wird der komplette Inhalt gelesen. Das dritte Statement liest eine IFS-Datei satzweise.
- Die Datei ist ein CLOB, das bedeutet ein Character Large Objekt, z. B. eine CSV, TEXT, HTML oder ähnliches. Im ACS oder im RPG-Programm geht das mit folgendem Statement:
values GET_CLOB_FROM_FILE('/home/test/csv/adressen.csv');
- Die Datei ist ein BLOB, das bedeutet ein Binary Large Objekt, z. B. eine PDF, PNG, AVI, JPG oder ähnliches. Das geht mit folgendem Statement:
values GET_BLOB_FROM_FILE('/home/test/csv/adressen.csv');
- Für das satzweise Lesen einer Datei gibt es drei Möglichkeiten:
- IFS_READ: Daten als Plain-Test
- IFS_READ_UTF8: Daten im UTF8-Format
- IFS_READ_BINARY: Daten im Binärformat
Für ein Beispiel nehme ich die Datei Adressen.csv, die UTF8-Zeichen enthält und lese diese mit folgendem Statement aus:
SELECT * FROM TABLE(
QSYS2.IFS_READ_UTF8('/home/test/csv/adressen.csv')
);
Wir erhalten folgendes Ergebnis und Sie sehen, dass das UTF8-Zeichen „Cœr“ korrekt dargestellt wird:

3. Das Erstellen einer IFS-Datei
Je nach Typ der Datei – Text, UTF8-Text oder Binär – gibt es die passende SQL-Funktion:
- IFS_WRITE: Daten als Plain-Test
- IFS_WRITE_UTF8: Daten im UTF8-Format
- IFS_WRITE_BINARY: Daten im Binärformat
Mit diesem Statement erstelle ich eine Datei im IFS und schreibe den Text ‚Beispiel Zeile 1′ hinein.
CALL QSYS2.IFS_WRITE_UTF8(
PATH_NAME => '/home/test/MyTestFile.txt',
LINE => 'Beispiel Zeile 1',
END_OF_LINE => 'CRLF',
OVERWRITE => 'REPLACE',
FILE_CCSID => '1208'
);
Sie sehen, das Statement hat fünf Parameter:
- PATH_NAME: der Pfadname für die Datei
- LINE: der Text für die Zeile
- END_OF_LINE: das Zeilenende:
- CR: Carriage Return
- CRLF: Carriage Return und Line Feed
- LF: Line Feed
- LFCR: Line Feed und Carriage Return
- NONE: kein Zeichen am Zeilenende
- OVERWRITE: es gibt drei Werte:
- APPEND: die Datei existiert und es wird eine neue Zeile hinzugefügt
- REPLACE: die bestehende Datei wird gelöscht und durch die neue ersetzt
- NONE: wenn die Datei noch nicht existiert, wird sie erstellt, wenn sie schon vorhanden ist, bleibt sie erhalten
- FILE_CCSID: die CCSID der Datei
Jetzt modifiziere ich das Statement und füge der Datei eine weitere Zeile mit APPEND hinzu:
CALL QSYS2.IFS_WRITE_UTF8(
PATH_NAME => '/home/test/MyTestFile.txt',
LINE => Beispiel Zeile 2,
END_OF_LINE => 'CRLF',
OVERWRITE => 'APPEND',
FILE_CCSID => '1208'
);
und lese die Datei mit:
SELECT * FROM TABLE(
QSYS2.IFS_READ_UTF8('/home/test/MyTestFile.txt')
);
Ergebnis:

4. Das Kopieren einer IFS-Datei
Dafür gibt es keine spezielle Funktion, aber mit einem kleinen Trick ist auch das auf einfache Weise möglich. Dazu verwende ich IFS_WRITE und verbinde es mit GET_CLOB_FROM_FILE:
CALL QSYS2.IFS_WRITE_UTF8(
PATH_NAME => '/home/test/csv/Adressen_neu.csv',
LINE => get_clob_from_file('/home/test/csv/Adressen.csv'),
END_OF_LINE => 'NONE',
OVERWRITE => 'REPLACE',
FILE_CCSID => '1208'
);
Ich hatte mich schon auf das Ergebnis gefreut, bin aber ziemlich enttäuscht, denn das UTF8-Zeichen „Cœr“ wurde nicht korrekt umgesetzt.

Da muss es noch etwas Besseres geben, deshalb versuche ich es mit IFS_WRITE_BINARY und GET_BLOB_FROM_FILE:
CALL QSYS2.IFS_WRITE_BINARY(
PATH_NAME => '/home/test/csv/Adressen_neu.csv',
LINE => get_blob_from_file('/home/test/csv/Adressen.csv'),
END_OF_LINE => 'NONE',
OVERWRITE => 'REPLACE',
FILE_CCSID => '1208'
);
und schon erhalten wir das richtige Ergebnis:

TIPP: Damit können Sie mühelos auch folgende Formate, und was es sonst noch an Binärdateien gibt, kopieren: PDF, XLSX, JPG, PNG usw.
5. Das Löschen von IFS-Dateien
Mit dem letzten Technologie-Refresh kam endlich diese SQL-Funktion auf die Maschine. Wie die schon sehr lange verfügbare API unlink, heißt auch diese IFS_UNLINK und sieht so aus:
Values SYSTOOLS.IFS_UNLINK('/home/test/csv/Adressen.csv');
Falls Sie auf die Idee kommen, alle Dateien in einem IFS-Directory zu löschen, die eine bestimmte Größe überschreiten, auch dafür gibt ein schönes Statement:
WITH X (PATH_NAME, OBJECT_TYPE, CREATE_TIMESTAMP,
TO_CHAR(DATA_SIZE, '999G999G999') AS "Size", ERRNO) as (
SELECT cast(PATH_NAME as varchar(128) CCSID 1208) AS PATH_NAME,
OBJECT_TYPE, CREATE_TIMESTAMP, DATA_SIZE,
SYSTOOLS.IFS_UNLINK(PATH_NAME)
FROM TABLE(
QSYS2.IFS_OBJECT_STATISTICS(
START_PATH_NAME => '/home/test',
SUBTREE_DIRECTORIES => 'NO',
OBJECT_TYPE_LIST => '*ALLSTMF'
)
)
)
SELECT X.*, SYSTOOLS.ERRNO_INFO(X.ERRNO) AS "Error Description"
FROM X
WHERE DATA_SIZE > 100000;
Viel Spaß beim Ausprobieren.
Den Autor Rainer Ross erreichen Sie unter:
Rainer Ross IT-Beratung
Bgm.-Hollweck-Str. 6
85599 Parsdorf
Ausgezeichnet mit dem Innovationspreis der IBM und Spezialist für Webservices und Webanwendungen auf IBM i so schnell wie Greenscreen.
Beispiel: www.myhofi.com/myapps/HTML/Myapp.html
Tel. (+49) 151/684 375 53 oder 089/413 252 94
E-Mail: rainer_ross@web.de