Registriert seit: 7. Jun 2002
1.339 Beiträge
|
Dateien in ListView eintragen - Fortschritt anzeigen lassen
25. Feb 2005, 23:22
Hi,
ich habe folgenden Code hier aus der DP genommen und in mein Programm eingebaut. Es handelt sich um den Code, mit dem man die Dateien eines Verzeichnisses (inkl. Unterverzeichnisse) auslesen kann. Dies kann ja bei vielen Dateien sehr lange dauern. Meine Frage ist nun, wie ich den Fortschritt in einer ProgressBar anzeigen lassen kann. Zudem sollten die Dateien erst in der ListView gezeigt werden, wenn alle eingetragen wurden (das geht mit BeginUpdate und EndUpdate, doch wo baue ich das hier im Code ein?).
Hier ist der genaue Code:
Code:
function TForm1.FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True) : TStringDynArray;
var
wfd : TWin32FindData;
hFile : THandle;
SLVItem : TListItem;
IDTag : TID3v2;
begin
if AnsiLastChar(RootFolder)^ <> '\' then
RootFolder := RootFolder + '\';
if Recurse then
begin
hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);
if hFile <> INVALID_HANDLE_VALUE then
try
repeat
if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
FILE_ATTRIBUTE_DIRECTORY then
if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..')
then
FindAllFiles(RootFolder + wfd.cFileName, Mask, Recurse);
until FindNextFile(hFile, wfd) = False;
finally
windows.FindClose(hFile);
end;
end;
hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);
if hFile <> INVALID_HANDLE_VALUE then
try
repeat
if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <>
FILE_ATTRIBUTE_DIRECTORY then
begin
SLVItem := Form1.SmartListView1.Items.Add;
SLVItem.SubItems.Add(wfd.CFileName);
// MP3
if LowerCase(Copy(wfd.CFileName, LastDelimiter('.', wfd.CFileName)+1, Length(wfd.CFileName)-LastDelimiter('.', wfd.CFileName))) = 'mp3' then
begin
SLVItem.ImageIndex := 0;
SLVItem.SubItems.Add('Mp3 - Datei');
// ID-Tags auslesen
IDTag := TID3v2.Create;
IDTag.ReadFromFile(RootFolder + wfd.CFileName);
SLVItem.SubItems.Add(IDTag.Artist);
SLVItem.SubItems.Add(IDTag.Title);
SLVItem.SubItems.Add(IDTag.Genre);
end;
// WAVE
if LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) = 'wav' then
begin
SLVItem.ImageIndex := 0;
SLVItem.SubItems.Add('Wave - Datei');
end;
// MPG, MPEG, AVI, WMV, ASF
if IstVideoDatei(wfd.cFileName) = True then
begin
SLVItem.ImageIndex := 1;
SLVItem.SubItems.Add('Video - Datei');
end;
// Wenn es keiner der o.a. Dateien ist
if (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mp3') and
(LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'wav') and
(LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mpg') and
(LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mpeg') and
(LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'wmv') and
(LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'asf') and
(LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'avi') then
begin
SLVItem.ImageIndex := 2;
SLVItem.SubItems.Add('Sonstige Datei');
end;
end;
until FindNextFile(hFile, wfd) = False;
finally
Windows.FindClose(hFile);
end;
end;
Ich hoffe, mir kann jemand helfen. Danke!
Gruß Yheeky
|