PDA

View Full Version : OpenDir, ReadDir, CloseDir



Frank ter Duis
17-09-14, 13:21
Moin Moin,

ich möchte in ILE RPG ein IFS Verzeichnis auslesen. Dafür habe ich vor die OpenDir, ReadDir und CloseDir API's zu verwenden. Leider scheitet es schon beim mir beim OpenDir.

Egal ob ich /BIN, /bin, /BIN/ oder /bin/ öffnen möchte, bekomme ich immer den Fehlercode 3025 "No such path or directory" zurück.

"DSPLNK OBJ('/bin')" gibt mir ein Ergebnis zurück, der Pfad ist aus meiner Sicht OK.

Hat jemand einen Tipp für mich, was ich falsch mache?

Gruß und Danke Frank



D DIR S * INZ(*NULL)
D DIR_FILE S *

D READDIR PR * EXTPROC('readdir')
D DIRP * VALUE

D OPENDIR PR * EXTPROC('opendir')
D DIRNAME * CONST OPTIONS(*STRING)

D CLOSEDIR PR 10I 0 EXTPROC('closedir')
D DIRHANDLE * VALUE

C EVAL ERRYN = 'N'
C EVAL PATH = '/BIN/'
C EVAL DIR = OPENDIR(%TRIM(PATH))

C IF DIR <> *NULL

C ELSE
C EVAL P_ERRNO = SYS_ERRNO()
C EVAL msgtxt = %char(errno)
C ENDIF

Pikachu
17-09-14, 14:26
Vermutlich ist der Prototyp falsch definiert. Nimm mal VALUE anstelle von CONST.

http://www.scottklement.com/rpg/ifs_ebook/opendir.html

malzusrex
17-09-14, 14:34
Pikachu war schneller...

Liegt an der Definition


D opendir PR * EXTPROC('opendir')
D dirname * VALUE options(*string)


Gruß
Ronald

Frank ter Duis
17-09-14, 14:40
Treffer! DANKE!

Das VALUE zusammen mit dem x'00' funktioniert. Verstehe die Zusammenhänge zwar nicht, komme so aber erstmal weiter.



D OPENDIR PR * EXTPROC('opendir')
D DIRNAME * VALUE OPTIONS(*STRING)

C EVAL PATH = %trim('/bin') + x'00'

Nochmal Danke für die schnelle Hilfe!

malzusrex
17-09-14, 14:42
Also bei mir geht das auch ohne den x'00'

Gruß
Ronald

Frank ter Duis
17-09-14, 14:51
Gerade noch mal getestet. Mit x'00' klappts super, ohne bekomme ich den Fehler 3486 "A path name is too long"..... aber keine Zeit mehr daran verschwenden bitte.

B.Hauser
17-09-14, 14:53
Ich nehme an dass PATH ein Feld mit fixer Länge definiert ist

Birgitta

Fuerchau
17-09-14, 15:01
Wenn du mit C-Routinen und Parametern vom Typ *String umgehst, so solltest du alle Felder als Varying definieren oder per %trim(MyField) an die Routine übergeben.
Durch Options(*string) wird das x'00' sowieso automatisch drangehängt.

Dies wird dir auch bei weiteren C-Routinen begegnen.

Fuerchau
17-09-14, 15:04
Also bei CHAR*-Parametern unterscheidet sich Value und Const nicht wirklich.
Es wird immer ein Pointer übergeben.
Allerdings kannst du durch Const/Value dann auch Konstanten als Parameter übergeben.

%trim() auf eine Konstante macht übrigens keinen Sinn.