Skip to main content

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.MOD
I
SUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",2)
D4/
Date Mod
10R
S

TIME.MOD
I
SUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",3)
MTS
Time Mod
10R
S


FILE.SIZE
I
SUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",1)
MD0,
File Size
10R
S

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"
$ENDIF
SUBROUTINE GET.FILE.DETS(FILE.DETS, FILE.NAME, K.FILE.NAME)
$IFDEF U2__UNIVERSE
$OPTIONS INFORMATION
$OPTIONS -INFO.LOCATE
$ENDIF
FILE.DETS = ""
IF FILE.NAME = "" THEN RETURN
COMMON / FPATHS / FPATHS.NAMES, FPATHS.PATHS, FPATHS.SEP
IF 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 = "/"
END
CHECK.NAME = @PATH : "*" : FILE.NAME
LOCATE 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
  END
END
$IFNDEF U2__UNIVERSE
FILESTAT = 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__UNIVERSE
OPENSEQ FILE.PATH : FPATHS.SEP : K.FILE.NAME TO F.SEQ.FILE ELSE RETURN
STATUS FILESTAT FROM F.SEQ.FILE ELSE RETURN
CLOSESEQ F.SEQ.FILE
FILE.SIZE = FILESTAT<6>
DATE.LAST.MOD = FILESTAT<16>
TIME.LAST.MOD = FILESTAT<15>
$ENDIF
FILE.DETS = FILE.SIZE : " " : DATE.LAST.MOD : " " : TIME.LAST.MOD
RETURN
END

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,198
root42827_12517620   08/05/2024   11:57:27     13,792
root42827_6029468    08/05/2024   11:57:04     12,528
root42828_9044064    08/05/2024   11:54:09      1,580
root42828_9699552    08/05/2024   11:57:27     14,147
5 records listed



------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------

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.MOD
I
SUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",2)
D4/
Date Mod
10R
S

TIME.MOD
I
SUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",3)
MTS
Time Mod
10R
S


FILE.SIZE
I
SUBR("GET.FILE.DETS","_PH_",@ID); FIELD(@1," ",1)
MD0,
File Size
10R
S

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"
$ENDIF
SUBROUTINE GET.FILE.DETS(FILE.DETS, FILE.NAME, K.FILE.NAME)
$IFDEF U2__UNIVERSE
$OPTIONS INFORMATION
$OPTIONS -INFO.LOCATE
$ENDIF
FILE.DETS = ""
IF FILE.NAME = "" THEN RETURN
COMMON / FPATHS / FPATHS.NAMES, FPATHS.PATHS, FPATHS.SEP
IF 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 = "/"
END
CHECK.NAME = @PATH : "*" : FILE.NAME
LOCATE 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
  END
END
$IFNDEF U2__UNIVERSE
FILESTAT = 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__UNIVERSE
OPENSEQ FILE.PATH : FPATHS.SEP : K.FILE.NAME TO F.SEQ.FILE ELSE RETURN
STATUS FILESTAT FROM F.SEQ.FILE ELSE RETURN
CLOSESEQ F.SEQ.FILE
FILE.SIZE = FILESTAT<6>
DATE.LAST.MOD = FILESTAT<16>
TIME.LAST.MOD = FILESTAT<15>
$ENDIF
FILE.DETS = FILE.SIZE : " " : DATE.LAST.MOD : " " : TIME.LAST.MOD
RETURN
END

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,198
root42827_12517620   08/05/2024   11:57:27     13,792
root42827_6029468    08/05/2024   11:57:04     12,528
root42828_9044064    08/05/2024   11:54:09      1,580
root42828_9699552    08/05/2024   11:57:27     14,147
5 records listed



------------------------------
Jonathan Smith
UniData ATS
Rocket Support
------------------------------

Hi Jonathan,

Thank you for the share.



------------------------------
Manu Fernandes
------------------------------