|
This is a multipart message in MIME format. -- [ Picked text/plain from multipart/alternative ] Thanks again Scott. trim saved the day. Rob Berendt -- "They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety." Benjamin Franklin Scott Klement <klemscot@klements.com> Sent by: rpg400-l-admin@midrange.com 04/15/2002 06:32 PM Please respond to rpg400-l To: rob@dekko.com cc: rpg400-l@midrange.com Fax to: Subject: Re: ifs api's Rob, Try trimming the trailing blanks off of the file name.... (This is a really common mistake.) The file is called: '/rob/spool2.txt' not '/rob/spool2.txt ' Consequently, it can't find the file. Either use a VARYING field, or put a %trimr() in the first argument to the stat() call... On Mon, 15 Apr 2002 rob@dekko.com wrote: > I've read Scott's example at: > http://archive.midrange.com/rpg400-l/200105/msg00320.html > > And I've read the Redbook 'Who knew...' for handling the errno part. > > I have a file which shows up with > wrklnk '/rob/spool2.txt' > > However, my command > STATTEST FILENAME('/rob/spool2.txt') > > Results in: > DSPLY 3025No such path or directory. > > File attributes: > Object . . . . . . : /rob/spool2.txt > > Type . . . . . . . . . . . . . . . . . : STMF > > Owner . . . . . . . . . . . . . . . . : ROB > System object is on . . . . . . . . . : Local > Auxiliary storage pool . . . . . . . . : 1 > Object overflowed . . . . . . . . . : No > > Coded character set ID . . . . . . . . : 37 > Hidden file . . . . . . . . . . . . . : No > PC system file . . . . . . . . . . . . : No > Read only . . . . . . . . . . . . . . : No > > Need to archive (PC) . . . . . . . . . : Yes > Need to archive (AS/400) . . . . . . . : No > Last access date/time . . . . . . . . : 01/07/02 17:50:5 > Data change date/time . . . . . . . . : 06/01/01 15:08:5 > Attribute change date/time . . . . . . : 10/21/01 11:11:5 > > Size of object data in bytes . . . . . : 2926 > Allocated size of object . . . . . . . : 8192 > File format . . . . . . . . . . . . . : *TYPE2 > Size of extended attributes . . . . . : 0 > Storage freed . . . . . . . . . . . . : No > > Auditing value . . . . . . . . . . . . : *NONE > > Object domain . . . . . . . . . . . . : *SYSTEM > > Number of hard links . . . . . . . . . : 1 > Last used date . . . . . . . . . . . . : 01/07/02 > Days used count . . . . . . . . . . . : 2 > Reset date . . . . . . . . . . . . . : > > Allow write during save . . . . . . . : No > > Digitally signed . . . . . . . . . . . : No > File ID . . . . . . . . . . . . . . . : > X'0000000000000001833C09CE0000A3BF' > > > > Entire source: > > > > H Datfmt(*USA) > H ExprOpts(*RESDECPOS) > H Bnddir('ROUTINES/SRVPGM':'QC2LE') > H ActGrp('QILE') > H DftActGrp(*NO) > D********************************************************************** > D* File Information Structure (stat) > D* > D* struct stat { > D* mode_t st_mode; /* File mode */ > D* ino_t st_ino; /* File serial number */ > D* nlink_t st_nlink; /* Number of links */ > D* uid_t st_uid; /* User ID of the owner of file */ > D* gid_t st_gid; /* Group ID of the group of file */ > D* off_t st_size; /* For regular files, the file > D* * size in bytes */ > D* time_t st_atime; /* Time of last access */ > D* time_t st_mtime; /* Time of last data modification > */ > D* time_t st_ctime; /* Time of last file status change > */ > D* dev_t st_dev; /* ID of device containing file */ > D* size_t st_blksize; /* Size of a block of the file */ > D* unsigned long st_allocsize; /* Allocation size of the file */ > D* qp0l_objtype_t st_objtype; /* AS/400 object type */ > D* unsigned short st_codepage; /* Object data codepage */ > D* char st_reserved1[66]; /* Reserved */ > D* }; > ** times in statds are seconds from the "epoch" (Jan 1, 1970) > ** and are in GMT (Greenwich Mean Time)... > D* > D p_statds S * > D statds DS BASED(p_statds) > D st_mode 10U 0 > D st_ino 10U 0 > D st_nlink 5U 0 > D st_pad 2A > D st_uid 10U 0 > D st_gid 10U 0 > D st_size 10I 0 > D st_atime 10I 0 > D st_mtime 10I 0 > D st_ctime 10I 0 > D st_dev 10U 0 > D st_blksize 10U 0 > D st_alctize 10U 0 > D st_objtype 12A > D st_codepag 5U 0 > D st_resv11 62A > D st_ino_gen_id 10U 0 > > D STATTEST PR EXTPGM('STATTEST') > D FileName 100a const > D STATTEST PI > D FileName 100a const > D*-------------------------------------------------------------------- > D* Get File Information > D* > D* int stat(const char *path, struct stat *buf) > D*-------------------------------------------------------------------- > D stat PR 10I 0 ExtProc('stat') > D path * value options(*string) > D buf * value > > D GetTimeZone PR 5A > > D timezone DS > D tzDir 1A > D tzHour 2S 0 > D tzFrac 2S 0 > > > D statsize S 10I 0 > d Msg S 50A > D AccessTime S Z > D ModifyTime S Z > D ChgStsTime S Z > D charTS S 26A > D Epoch S Z INZ(z'1970-01-01-00.00.00') > > DGetErrNo PR * ExtProc('__errno') > DStrError PR * ExtProc('strerror') > D ErrorNo 10i 0 Value > DpErrorNo s * inz > DErrorNo s 10i 0 based(pErrorNo) > DpErrorMsg s * inz > DErrorMsg s 100a based(pErrorMsg) > > c eval *inlr = *on > > c eval statsize = %size(statds) > c alloc statsize p_statds > > c if stat(FileName: p_statds) < 0 > c eval pErrorNo = GetErrNo > c eval pErrorMsg = StrError(ErrorNo) > c eval Msg = %char(ErrorNo) + ErrorMsg > c > c dsply Msg > c return > c endif > > ** times in statds are seconds from the "epoch" (Jan 1, 1970) > ** and are in GMT (Greenwich Mean Time)... > ** Hey! Lets convert them to RPG timestamps! > c Epoch adddur st_atime:*S AccessTime > c Epoch adddur st_mtime:*S ModifyTime > c Epoch adddur st_ctime:*S ChgStsTime > > ** adjust timestamps for timezone: > c eval timezone = GetTimeZone > c if tzDir = '-' > c subdur tzHour:*H AccessTime > c subdur tzHour:*H ModifyTime > c subdur tzHour:*H ChgStsTime > c else > c adddur tzHour:*H AccessTime > c adddur tzHour:*H ModifyTime > c adddur tzHour:*H ChgStsTime > c endif > > C* display the relevant times: > c move AccessTime charTS > c eval Msg = 'Last Access ' + charTS > c dsply Msg > > c move ModifyTime charTS > c eval Msg = 'Last Modified ' + charTS > c dsply Msg > > c move ChgStsTime charTS > c eval Msg = 'Status Changed ' + charTS > c dsply Msg > > c dealloc p_statds > c eval *inlr = *on > > > P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > P* This gets the offset from Universal Coordinated Time (UTC) > P* from the system value QUTCOFFSET > P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > P GetTimeZone B > D GetTimeZone PI 5A > D peRcvVar S 1A DIM(100) > D peRVarLen S 10I 0 > D peNumVals S 10I 0 > D peSysValNm S 10A > D p_Offset S * > D wkOffset S 10I 0 BASED(p_Offset) > D p_SV S * > D dsSV ds BASED(p_SV) > D dsSVSysVal 10A > D dsSVDtaTyp 1A > D dsSVDtaSts 1A > D dsSVDtaLen 10I 0 > D dsSVData 5A > D dsErrCode DS > D dsBytesPrv 1 4B 0 INZ(256) > D dsBytesAvl 5 8B 0 INZ(0) > D dsExcpID 9 15 > D dsReserved 16 16 > D dsExcpData 17 256 > C CALL 'QWCRSVAL' 99 > C PARM peRcvVar > C PARM 100 peRVarLen > c PARM 1 peNumVals > c PARM 'QUTCOFFSET' peSysValNm > c PARM dsErrCode > c if dsBytesAvl > 0 or *IN99 = *On > c return *blanks > c endif > c eval p_Offset = %addr(peRcvVar(5)) > c eval p_SV = %addr(peRcvVar(wkOffset+1)) > c return dsSVData > P E > > Rob Berendt > -- > "They that can give up essential liberty to obtain a little temporary > safety deserve neither liberty nor safety." > Benjamin Franklin _______________________________________________ This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list To post a message email: RPG400-L@midrange.com To subscribe, unsubscribe, or change list options, visit: http://lists.midrange.com/cgi-bin/listinfo/rpg400-l or email: RPG400-L-request@midrange.com Before posting, please take a moment to review the archives at http://archive.midrange.com/rpg400-l.
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.