'=========================================================================== ' Subject: FILE SORT Date: 12-23-96 (14:37) ' Author: Egbert Zijlema Code: PB ' Origin: E.Zijlema@uni4nn.iaf.nl Packet: PB.ABC '=========================================================================== ' FILESORT.BAS - PB routine to sort files in current directory ' either alphabetically or by date/time (LiFo) ' Author : Egbert Zijlema (E.Zijlema@uni4nn.iaf.nl) ' (up)Date : 24 December 1996 ' Language : Power Basic (3.2) ' (C) status : Public Domain ' ARRAY SORT is a piece of cake in Power Basic, since it's a built-in ' routine. Why this sample code for such a simple matter? To demonstrate ' how to sort the contents of a directory by date/time (last in, first out). DEFINT A - Z ' all vars integer unless tagged %NO = 0 : %YES = NOT %NO ' Boolean true/false %F1 = 59 * 256 ' funkey to change dir %F2 = 60 * 256 ' funkey to toggle sort method %ALTX = 45 * 256 ' exit program %UP = 72 * 256 : %DOWN = 80 * 256 ' scroll keys TYPE FLAGS stamp AS INTEGER ' sort by date/time recs AS INTEGER ' number of records in array first AS INTEGER ' first file on screen END TYPE DIM flg AS SHARED FLAGS DIM FileName(1 : 512) AS SHARED STRING ' array for filenames DIM DateTime(1 : 512) AS SHARED STRING ' array for date/time stamps DIM FileDir AS SHARED STRING flg.stamp = %YES ' sort by date = default FileDir = CURDIR$ ' current dir = default FUNCTION GetKey AS INTEGER DO LOOP UNTIL INSTAT FUNCTION = CVI(INKEY$ + CHR$(0)) END FUNCTION SUB MakeArrays flg.recs = 0 flg.first = 1 number = FREEFILE FileFound$ = DIR$(FileDir + "\*.*") DO WHILE LEN(FileFound$) OPEN FileDir + "\" + FileFound$ FOR BINARY AS #number dos = FILEATTR(number, 2) ' DOS-handle REG 1, &H5700 ' load function &H5700 in AX REG 2, dos ' load DOS-handle in BX CALL INTERRUPT &H21 ' interrupt call carry = REG (0) AND 1 ' carry flag CLOSE #number INCR flg.recs FileName(flg.recs) = LEFT$(FileFound$ + SPACE$(12), 12) IF carry THEN ' error DateTime(flg.recs) = "33" ' 1 January 1980 ELSE DateTime(flg.recs) = LTRIM$(RTRIM$(STR$(REG(4)))) + _ ' date stamp LTRIM$(RTRIM$(STR$(REG(3)))) ' time stamp END IF IF flg.recs = UBOUND(FileName) THEN EXIT DO ' full array FileFound$ = DIR$ LOOP SortArrays END SUB SUB SortArrays IF flg.stamp THEN ARRAY SORT DateTime() FOR flg.recs, TAGARRAY FileName(), DESCEND ELSE ARRAY SORT FileName() FOR flg.recs, TAGARRAY DateTime(), ASCEND END IF END SUB SUB DisplayArray row = 1 FOR count = flg.first TO flg.first + 19 ' display 20 files LOCATE row, 2 IF count > flg.recs THEN ' no more files PRINT SPACE$(12) ' clear unused rows ELSE PRINT FileName(count) END IF INCR row NEXT END SUB SUB Menu DO KeyIn = GetKey SELECT CASE KeyIn CASE %F1 DO LOCATE 23, 13 : PRINT SPACE$(66); LOCATE 23, 13 LINE INPUT ""; text$ LOOP UNTIL LEN(DIR$(text$, 16)) ' until valid dir name LOCATE 23, 13 : PRINT UCASE$(text$) FileDir = text$ MakeArrays DisplayArray CASE %F2 LOCATE 24, 9 IF flg.stamp THEN flg.stamp = %NO PRINT "alphabetically"; ELSE flg.stamp = %YES PRINT "by date (LiFo)" ; END IF SortArrays DisplayArray CASE %DOWN IF flg.recs < 21 OR flg.first + 19 = flg.recs THEN EXIT SELECT INCR flg.first DisplayArray CASE %UP IF flg.first > 1 THEN DECR flg.first DisplayArray END IF CASE %ALTX CLS SYSTEM END SELECT LOOP END SUB ' main CLS LOCATE 23, 2 : PRINT "Directory: "; UCASE$(FileDir) LOCATE 24, 2 : PRINT "Sorted "; IF flg.stamp THEN PRINT "by date (LiFo)" ELSE PRINT "alphabetically" END IF LOCATE 25, 2 : PRINT "F1 = directory; F2 = sort order; Alt-x = quit; "; PRINT "Arrow Up/Down = scroll"; MakeArrays DisplayArray Menu END