Набросал, вот:
| Код | { by Qu1nt } program Project1;
{$APPTYPE CONSOLE}
uses Windows, SysUtils, Classes, Contnrs, Math;
type TFile = class constructor Create(const Name: AnsiString; Size: Int64; Time: Integer); private Name: AnsiString; Size: Int64; Time: Integer; end;
TFiles = class(TObjectList) constructor Create(const Path, Mask: AnsiString); public type TOrder = (ORDER_ASC, ORDER_DESC); TSort = (SORT_NAME, SORT_SIZE, SORT_DATE); procedure Print(const SortFlags: array of TSort; OrderType: TOrder = ORDER_ASC; List: TStrings = nil); private class var SortFlags : array of TSort; Order : TOrder; end;
function EpicSort(Item1, Item2: Pointer): Integer; var SortFlag: TFiles.TSort; begin Result := 0; for SortFlag in TFiles.SortFlags do begin case SortFlag of SORT_NAME : Result := AnsiCompareStr(TFile(Item1).Name, TFile(Item2).Name); SORT_SIZE : Result := CompareValue(TFile(Item1).Size, TFile(Item2).Size); SORT_DATE : Result := CompareValue(TFile(Item1).Time, TFile(Item2).Time); end; // по убыванию? инвертируем результат if TFiles.Order = ORDER_DESC then Result := - Result; // если сравниваемые данные не равны if Result <> 0 then Exit; end; end;
{ TFile } constructor TFile.Create; begin Self.Name := Name; Self.Size := Size; Self.Time := Time; end;
{ TFiles } constructor TFiles.Create; var SearchRec: TSearchRec; begin inherited Create; // ищем файлы по заданной маске, директории игнорируются if FindFirst(IncludeTrailingPathDelimiter(Path) + Mask, faAnyFile - faDirectory, SearchRec) = 0 then repeat // добавляем в список with SearchRec do Add(TFile.Create(Name, Size, Time)); until FindNext(SearchRec) <> 0; FindClose(SearchRec); end;
procedure TFiles.Print;
function PrintLn(const Line: AnsiString): AnsiString; begin if Line <> '' then begin SetLength(Result, Length(Line)); // корректный вывод русских букавок = ) CharToOem(PAnsiChar(Line), PAnsiChar(Result)); end; WriteLn(Result); end;
var Item: Pointer; begin // если не указали ниодного типа сортировки - сортировать не будем SetLength(Self.SortFlags, Length(SortFlags)); if Length(Self.SortFlags) > 0 then begin System.Move(SortFlags[0], Self.SortFlags[0], Length(SortFlags) * SizeOf(TSort)); Self.Order := OrderType; // наша эпическая сортировка Sort(EpicSort); end; // если указан список - пишем в него // очистка списка, Begin-EndUpdate на Ваших плечах :) for Item in Self do with TFile(Item) do if Assigned(List) then List.Append(Name) else PrintLn(Name); end;
begin // получаем список файлов только один раз - в конструкторе with TFiles.Create('c:\', '*.*') do try // указываем тип, порядок сортировки и выходной список // сортировки: SORT_NAME, SORT_SIZE, SORT_DATE - по имени, размеру, дате // порядок: ORDER_ASC, ORDER_DESC - по возрастанию, убыванию // // можно сортировать сразу по нескольким параметрам // например, нижеприведенный пример будет сперва сравнивать размеры // двух файлов. Если они одинаковы - дополнительно сравнит их имена Print([SORT_SIZE, SORT_NAME], ORDER_DESC); // Print([SORT_DATE, SORT_SIZE, SORT_NAME]); ORDER_ASC - по-умолчанию // Print([]); - без сортировки // Print([SORT_NAME], ORDER_ASC, List); - запись в список finally // освобождаем память Free; end; ReadLn; end.
|
|