I've posed this as it is based on technote that I've wrtitten and the code was written based on a customer support case and I thought other customers may find it useful. The example usage is with the _PH_ file. The code will work for both UniVerse and UniData.
The following example is based on the UniData _PH_ file but can easily be transferred to any other directory type data file you wish to report on.
Create the following dictionary items.
DATE.MODISUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",2)D4/Date Mod10RS
TIME.MODISUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",3)MTSTime Mod10RS
FILE.SIZEISUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",1)MD0,File Size10RS
Then use the CD command to compile the new dictionary items.
Create the GET.FILE.DETS program as below (or see the attachment)
$IFNDEF U2__UNIVERSE$BASICTYPE "U"$ENDIFSUBROUTINE GET.FILE.DETS(FILE.DETS, FILE.NAME, K.FILE.NAME)$IFDEF U2__UNIVERSE$OPTIONS INFORMATION$OPTIONS -INFO.LOCATE$ENDIFFILE.DETS = ""IF FILE.NAME = "" THEN RETURNCOMMON / FPATHS / FPATHS.NAMES, FPATHS.PATHS, FPATHS.SEPIF FPATHS.SEP = 0 THEN FPATHS.NAMES = "" FPATHS.PATHS = ""$IFNDEF U2__UNIVERSE UNIX.WIN = SYSTEM(33) IF FIELD(UPCASE(UNIX.WIN), " ", 1) = "WINDOWS" THEN OS.WINDOWS = @TRUE ELSE OS.WINDOWS = @FALSE$ENDIF$IFDEF U2__UNIVERSE UNIX.WIN = SYSTEM(91) IF UNIX.WIN = "1" THEN OS.WINDOWS = @TRUE ELSE OS.WINDOWS = @FALSE$ENDIF IF OS.WINDOWS THEN FPATHS.SEP = "\\" ELSE FPATHS.SEP = "/"ENDCHECK.NAME = @PATH : "*" : FILE.NAMELOCATE CHECK.NAME IN FPATHS.NAMES, 1 SETTING FPATHS.POS THEN FILE.PATH = FPATHS.PATHS<FPATHS.POS>END ELSE OPEN FILE.NAME TO F.FILE.NAME THEN FILE.PATH = FILEINFO(F.FILE.NAME, 2) FILE.TYPE = FILEINFO(F.FILE.NAME, 3) IF FILE.TYPE NE 4 THEN RETURN FPATHS.NAMES<-1> = CHECK.NAME FPATHS.PATHS<-1> = FILE.PATH END ELSE RETURN ENDEND$IFNDEF U2__UNIVERSEFILESTAT = DIR(FILE.PATH : FPATHS.SEP : K.FILE.NAME)FILE.SIZE = FILESTAT<1>DATE.LAST.MOD = FILESTAT<2>TIME.LAST.MOD = FILESTAT<3>$ENDIF$IFDEF U2__UNIVERSEOPENSEQ FILE.PATH : FPATHS.SEP : K.FILE.NAME TO F.SEQ.FILE ELSE RETURNSTATUS FILESTAT FROM F.SEQ.FILE ELSE RETURNCLOSESEQ F.SEQ.FILEFILE.SIZE = FILESTAT<6>DATE.LAST.MOD = FILESTAT<16>TIME.LAST.MOD = FILESTAT<15>$ENDIFFILE.DETS = FILE.SIZE : " " : DATE.LAST.MOD : " " : TIME.LAST.MODRETURNEND
Compile and Catalog the program.
You can now use the DATE.MOD, TIME.MOD and FILE.SIZE dictionaries in a query or SELECT statement.
LIST _PH_ DATE.MOD TIME.MOD FILE.SIZE 13:02:32 Nov 06 2024 1_PH_................ Date Mod.. Time Mod.. File Size.
root42827_12386430 08/05/2024 11:57:10 29,198root42827_12517620 08/05/2024 11:57:27 13,792root42827_6029468 08/05/2024 11:57:04 12,528root42828_9044064 08/05/2024 11:54:09 1,580root42828_9699552 08/05/2024 11:57:27 14,1475 records listed
------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------