How to sort directory entries by date / time (Views: 702)
Problem/Question/Abstract: How to sort directory entries by date / time Answer: type PEntryItem = ^TEntryItem; TEntryItem = record FName: string; FDate: TDateTime; FSize: Integer; end; function SortList(item1, item2: Pointer): integer; var i1: PEntryItem absolute Item1; i2: PEntryItem absolute Item2; begin if (i1^.fdate > i2^.fdate) then result := 1 {greater} else if (i1^.fdate < i2^.fdate) then result := -1 {smaller} else result := 0; {equals} end; procedure DoTheJob; var List: TList; i: Integer; procedure GetDirEntries(Path: string); var Dta: TSearchRec; P: PEntryItem; begin if (Path <> '') and (Path[Length(Path)] = '\') then setlength(Path, Pred(Length(Path))); if FindFirst(Path + '\*.*', faAnyFile, Dta) <> 0 then exit; {Nothing} repeat {remove next line if you want these two as well} if (Dta.Name = '.') or (dta.name = '..') then continue; New(P); P^.FName := Dta.Name; P^.FSize := Dta.Size; P^.FDate := FileDateToDateTime(Dta.Time); List.Add(P); until (FindNext(Dta) <> 0); FindClose(Dta); end; begin List := TList.Create; List.Clear; try GetDirEntries('C:\Windows'); if (list.Count > 0) then List.Sort(SortList); {Now you have a list with all the files in the directory sorted by its date/time field. To access them do as follows:} for i := 0 to list.count - 1 do begin with PEntryItem(List.Items[i])^ do begin {I assume you have a Form called MainFrm with a Listbox1} MainFrm.ListBox1.Items.Add(Format('%s %d %s', [FName, FSize, FormatDateTime('dd/mm/yyyy HH:NN:SS', FDate)])); end; end; finally {make sure to relase the memory allocated} while (list.count > 0) do begin Dispose(PEntryItem(List.Items[0])); List.Delete(0); end; List.Free; end; end; |