Ordner einlesen ==>Schnellere Methode<==
-
Hallo...
mit folgenden Zeilen sollen alle Ordner eines Verzeichnisses eingelesen werden. Leider ist diese Methode sehr langsam...
Sieht jemand einen Weg, wo Geschwindigkeit rausgeholt werden kann ???
void __fastcall TForm1::OrdnerEinlesen() { TListItem *MeinLinkesItem; SHFILEINFO FileInfo; BY_HANDLE_FILE_INFORMATION lpFileInfo; TIcon *MyIcon = new TIcon(); WORD wTemp; AnsiString MyAttribut = ""; int attrnr = 0; TSearchRec sr; int iAttributes = faAnyFile; int DateiIcon; SYSTEMTIME sysTime; FILETIME filetime; TDateTime dtFileCreated; // enthält Erstellungsdatum //TDateTime dtFileLastModified; // enthält Datum der letzten Änderung AnsiString DateiName; DWORD DWattrnr; FileList->Clear(); if(UnterVerzeichnis == true) { MeinLinkesItem = Form1->ListView1->Items->Add(); MeinLinkesItem->Caption = ".."; MeinLinkesItem->ImageIndex = 3; MeinLinkesItem->SubItems->Add(""); MeinLinkesItem->SubItems->Add("<DIR>"); MeinLinkesItem->SubItems->Add(UnterVerzeichnisDatum); MeinLinkesItem->SubItems->Add(UnterVerzeichnisAttribut); Form1->ListView1->Update(); } if (FindFirst(VerzeichnisUndErweiterung, iAttributes, sr) == 0) { do { attrnr = sr.Attr; if (BOOL(attrnr & FILE_ATTRIBUTE_DIRECTORY)) { //--------------------------------------------------------------------------- DateiPfad = VerzeichnisPfad; DateiName = ExtractFileName(sr.Name); AppendStr(DateiPfad,DateiName); Form1->Caption = DateiPfad.c_str(); //--------------------------------------------------------------------------- SHGetFileInfo(DateiPfad.c_str(),0,&FileInfo,sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_SMALLICON); MyIcon->Handle = FileInfo.hIcon; Form1->ImageList3->AddIcon(MyIcon); /////////////////////////////////////////////////////////////// //Icon entsprechend der Dateiendung anzeigen (2ms schneller)// ///////////////////////////////////////////////////////////// //DWORD dwFileAttributes = GetFileAttributes(DateiPfad.c_str()); //SHGetFileInfo(DateiPfad.c_str(), dwFileAttributes, &FileInfo, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); //MyIcon->Handle = FileInfo.hIcon; //Form1->ImageList3->AddIcon(MyIcon); //////////////////////////////////////////////////////////////////// //Ende Icon entsprechend der Dateiendung anzeigen (2ms schneller)// ////////////////////////////////////////////////////////////////// DateiIcon = Form1->ImageList3->Count-1; //--------------------------------------------------------------------------- FileTimeToSystemTime(&(sr.FindData.ftCreationTime), &sysTime); dtFileCreated = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) + TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay); //FileTimeToSystemTime(&(sr.FindData.ftLastWriteTime), &sysTime); //dtFileLastModified = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) //+ TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay); DateiZeit = dtFileCreated; //--------------------------------------------------------------------------- //DWattrnr = sr.Attr; DWattrnr = GetFileAttributes(DateiPfad.c_str()); //Gibt bei Dateien, die //in Verwendung sind //keine Attribute aus! MyAttribut = ""; if (BOOL(DWattrnr & FILE_ATTRIBUTE_DIRECTORY)) { if (BOOL(DWattrnr & FILE_ATTRIBUTE_READONLY)) { AppendStr(MyAttribut,"R"); } else { AppendStr(MyAttribut,"-"); } if (BOOL(DWattrnr & FILE_ATTRIBUTE_ARCHIVE)) { AppendStr(MyAttribut,"A"); } else { AppendStr(MyAttribut,"-"); } if (BOOL(DWattrnr & FILE_ATTRIBUTE_HIDDEN)) { AppendStr(MyAttribut,"H"); } else { AppendStr(MyAttribut,"-"); } if (BOOL(DWattrnr & FILE_ATTRIBUTE_SYSTEM)) { AppendStr(MyAttribut,"S"); } else { AppendStr(MyAttribut,"-"); } } //--------------------------------------------------------------------------- if (BOOL(DWattrnr & FILE_ATTRIBUTE_REPARSE_POINT)) { DateiGroesse = "<LINK>"; } else if (!BOOL(DWattrnr & FILE_ATTRIBUTE_REPARSE_POINT)) { DateiGroesse = "<DIR>"; } //--------------------------------------------------------------------------- TFileItem* MyFileItem = new TFileItem; MyFileItem->DateiName = DateiName; MyFileItem->DateiErweiterung = ""; MyFileItem->DateiGroesse = DateiGroesse; MyFileItem->DateiZeit = DateiZeit; MyFileItem->DateiAttribut = MyAttribut; MyFileItem->DateiIcon = DateiIcon; FileList->Add(MyFileItem); //Form1->Caption = FileList->Count; ListView1->Items->Count = FileList->Count; Form1->ListView1->Update(); //--------------------------------------------------------------------------- } } while (FindNext(sr) == 0); FindClose(sr); } VerzeichnisZaehler = FileList->Count; int DateiNameZaehler = 0; }
Danke !
==>Eisbeer<==
-
Schalte mal die Aktualisierung des ListView für die Dauer des Füllens aus:
ListView->Items->BeginUpdate(); // Einträge hinzufügen ListView->Items->EndUpdate();
Gruß,
Doc
-
Dadurch sind die Einträge sind erst sichtbar wenn alles eingelesen wurde.
==>Eisbeer<==
-
Sieh dir mal das VirtualListView-Beispiel aus dem \examples-Verzeichnis des BCB an.