[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jul 2007
    Beiträge
    23

    OpenDir, ReadDir, CloseDir

    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

    Code:
    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

  2. #2
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Vermutlich ist der Prototyp falsch definiert. Nimm mal VALUE anstelle von CONST.

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

  3. #3
    Registriert seit
    May 2002
    Beiträge
    1.121
    Pikachu war schneller...

    Liegt an der Definition
    PHP-Code:
    D opendir         PR              *   EXTPROC('opendir')       
    D  dirname                        *   VALUE options(*string
    Gruß
    Ronald

  4. #4
    Registriert seit
    Jul 2007
    Beiträge
    23
    Treffer! DANKE!

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

    Code:
    D OPENDIR         PR              *   EXTPROC('opendir')           
    D  DIRNAME                        *   VALUE OPTIONS(*STRING)       
    
    C                EVAL      PATH = %trim('/bin') + x'00'
    Nochmal Danke für die schnelle Hilfe!

  5. #5
    Registriert seit
    May 2002
    Beiträge
    1.121
    Also bei mir geht das auch ohne den x'00'

    Gruß
    Ronald

  6. #6
    Registriert seit
    Jul 2007
    Beiträge
    23
    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.

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Ich nehme an dass PATH ein Feld mit fixer Länge definiert ist

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •