HI ,
ist doch eigendlich ganz einfach, mit FindFirst und FindNext.
Damit füllst Du 2 Listen eine für die Dateien und die andere List mit
den Verzeichnissen. Dann die Listen sortieren und das Listview füllen
Habe in alten Sachen was dazu gefunden:
Delphi-Quellcode:
type
PSRec = ^TSRec;
TSrec = record
Attr : Array[0..4] of Char;
Name : String;
Size : String;
Time : TDateTime;
end;
var
SearchRec : pSRec;
FChangeDir : String;
function Compare(Item1, Item2: Pointer): Integer;
begin
Result := CompareText(PSRec(Item1).Name, PSRec(Item2).Name);
end;
procedure CalcAttributes(FindData : TSearchRec; var Attributes : Array of Char);
begin
FillChar(Attributes, SizeOf(Attributes), ' ');
if (FindData.Attr and faARCHIVE) = faARCHIVE then Attributes[0] := 'A';
if (FindData.Attr and faREADONLY) = faREADONLY then Attributes[1] := 'R';
if (FindData.Attr and faHIDDEN) = faHIDDEN then Attributes[2] := 'H';
if (FindData.Attr and faSYSFILE) = faSYSFILE then Attributes[3] := 'S';
if (FindData.Attr and faDIRECTORY) = faDIRECTORY then Attributes[4] := 'D';
end;
procedure FindFolders(var FolderList : TList; var NonFolderList : TList);
var
SRec : TSearchRec;
begin
if FindFirst('*.*', faAnyFile, SRec) = 0 then
begin
repeat
if (SRec.Name <> '.') and (SRec.Name <> '..') then
begin
SearchRec := New(pSRec);
with SearchRec^ do
begin
Name := SRec.Name;
Time := FileDateToDateTime(SRec.Time);
Size := CalcFileSize(SRec);
end;
CalcAttributes(SRec, SearchRec^.Attr);
if (SRec.Attr and faDirectory) = faDirectory then FolderList.Add(SearchRec)
else NonFolderList.Add(SearchRec);
end;
until FindNext(SRec) <> 0;
FindClose(SRec);
end;
FolderList.Sort(Compare);
NonFolderList.Sort(Compare);
end;
CalcFileSize(SRec) macht nichts weiter als bei (SRec.Attr and faDirectory) = faDirectory
die Größenbezeichnung = "Verzeichnis" zurück zu geben.
Da
FindFirst('*.*' ohne Path aufgerufen wird, muss Du Dich selber darum kümmern, vieleicht so:
Delphi-Quellcode:
...
var
FolderList : TList;
NonFolderList : TList;
FCurrDir : String;
begin
if FChangeDir[Length(FChangeDir)] <> '\' then FChangeDir := FChangeDir + '\';
if DirectoryExists(FChangeDir) then
begin
GetDir(0, FCurrDir);
ChDir(FChangeDir);
lvFolders.Items.BeginUpdate;
lvFolders.Items.Clear;
FolderList := TList.Create;
try
NonFolderList := TList.Create;
try
FindFolders(FolderList, NonFolderList);
InsertItems(FolderList);
InsertItems(NonFolderList);
finally
NonFolderList.Free;
end;
finally
FolderList.Free;
end;
lvFolders.Items.EndUpdate;
ChDir(FCurrDir);
end;
end;
Wenn Du alles richtig verstanden und umgesetzt hast kann es so aussehen: