Anmelden

View Full Version : Lesen IFS: Fehler CPE3525 Objekt für die Verarbeitung zu gross



elmaro
30-09-11, 14:10
Hallo zusammen,
ich habe folgendes Problem:

Beim auslesen des IFS mittels readdir() bricht das Programm bei einem bestimmten grossen Eintrag mit CPE3525 ab.

Schleife für auslesen:
eval p_dirent = readdir(dir)
dow p_dirent <> *NULL
**
** verarbeitung daten
**
eval p_dirent = readdir(dir)
enddo

beim readdir kann doch kein parameter large_objects gesetzt werden?

Hat hier jemand eine idee?

vielen dank !

Fuerchau
30-09-11, 14:13
Da du nur die 32-Bit-Funktionen verwendest, können Objekte größer 2GB nicht bearbeitet werden.

Du musst dir die 64-Bit-Funktionen raussuchen.

elmaro
30-09-11, 14:15
gibt es für readdir() auch eine 64 bit funktion, die dann die large objects bearbeiten kann?

open64() kenne ich....

Fuerchau
30-09-11, 14:41
Probiers mal damit:
readdir_r()--Read Directory Entry (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/apis/readdirr.htm?resultof=%22%72%65%61%64%64%69%72%22% 20)

elmaro
03-10-11, 08:05
Hallo fuerchau,
danke für deinen tip:
readdir_r liefert mir momentan immer den Fehler 3408 retour:

**
eval rtc = readdir_r(dir : point64 : point64_3)
**

wieso muss ich noch suchen, momentan weiss ich nicht wieso....

elmaro
03-10-11, 12:52
Hilfe!
Ich steig nicht dahinter, wahrscheinlich verstehe ich die Logik vom Readdir_r nicht ganz....was wird hier mit Initialisieren gemeint?

Parm1 ist der Pointer vom Opendir()

Parm2, parm 3 ?
sollten eigentlich die Pointer zur dirent-Struktur sein, oder?

S.Neinawaie
03-10-11, 18:59
Hallo!

Ich hab dir mal schnell ein kleines Beispiel erstellt. (Testsystem: V5R3)

Diverse Aktionen (überprüfen auf *NULL bei Pointern/abfangen von "." und ".." bei OpenDir & ähnliches hab ich absichtlich nicht mit kopiert).



************************************************** ************************
* ReadDir_r - Entry/Result DataStructure *
************************************************** ************************
D DirEnt DS Based(Ptr_Result)
D Res01 16A
D FileNoGenId 10U 0
D FileNo 10U 0
D RecLen 10U 0
D Res03 10I 0
D Res04 6A
D Res05 2A
D NlsInfo 12A
D CCSID 10I 0 Overlay(NlsInfo:1)
D CtryId 2A Overlay(NlsInfo:5)
D LangId 3A Overlay(NlsInfo:7)
D Res06 3A Overlay(NlsInfo:10)
D FileNameLen 10U 0
D FileName 640A

************************************************** ************************
* ReadDir_r - Prototyp *
************************************************** ************************
D ReadDir PR 10I 0 ExtProc('readdir_r')
D Directory * Value Options(*String)
D Entry *
D Result *


/Free
Ptr_Dir = OpenDir('/home/test');
DoU (Ptr_Result = *NULL);
RtnCode = ReadDir(Ptr_Dir:Ptr_Entry:Ptr_Result);
EndDo;
RtnCode = CloseDir(Ptr_Dir);

*InLr = *On;
/End-Free Falls sich ein Fehler eingeschlichen hat, bitte ich um Rückmeldung.

Lg,
Sam

Nachtrag bezüglich Error Code 3408:


EFAULT 3408 The address used for an argument was not correct. In attempting to use an argument in a call, the system detected an address that is not valid.

elmaro
04-10-11, 06:53
Hallo Sam, merci f das Beispiel,

Der Fehler war anscheinend, dass ich Param 2+3 in den D-bestimmungen mit VALUE angegeben habe.

Jetzt ist der Fehler weg und ich kann mal damit arbeiten u schauen, ob das mit den Dateien > 2GB klappt.

Vielen Dank.