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.


Anmelden zum Antworten