Quel est le meilleur moyen de créer une base de données d'accès contenant les noms de fichiers à l'aide de C ++ Builder?

StackOverflow https://stackoverflow.com/questions/464108

Question

Dernière question pour la nuit. Et des excuses pour la noobness complète de cela.

J'ai, avec l'aide de stackoverflow et de Google, réalisé ce qui suit ...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ADOCommand1->CommandText = "drop table pictures purge";
 ADOCommand1->Execute();
 ADOCommand1->CommandText = "create table pictures(id autoincrement, filename TEXT(255), notes text(255), category text(20), rank int, filedate datetime,constraint table1_PK primary key(id));";
 ADOCommand1->Execute();
 AddFiles(Edit1->Text);
}
//---------------------------------------------------------------------------

int AddFiles(AnsiString path, int count)
{
 TSearchRec sr;
 int f,count2=0;
 f = FindFirst(path+"\\*.*", faAnyFile, sr);
 while( !f )
 {
  if(sr.Attr & faDirectory)
  {
   if(sr.Name != "."   &&   sr.Name != "..")
   {
    AnsiString subpath;
    subpath.sprintf("%s%s%s", path, "\\", sr.Name);
    count = AddFiles(subpath,count);
   }
  }
  else
  {
   Form1->ADOCommand1->CommandText = "Insert into pictures (filename) values ('" + StringReplace(path + "\\" + sr.Name, "'", "''", TReplaceFlags()<<rfReplaceAll) + "')";
   Form1->ADOCommand1->Execute();
   ++count;
   ++count2;
   if (count2 > 100)
   {
    count2 = 0;
    Form1->Caption = "Added " + IntToStr(count)+ " Files.";
    Application->ProcessMessages();
   }

  }
  f = FindNext(sr);

 }
 FindClose(sr);
return count;
}

Il s'agit essentiellement de parcourir un répertoire donné et ses sous-répertoires et d'ajouter chaque fichier (avec chemin) à une base de données MS Access.

(Je suis le seul utilisateur, donc je ne me soucie pas de la sécurité)

Avec un grand nombre de fichiers, ce code est horriblement lent. Quelqu'un peut-il décrire une meilleure façon de faire ce que le code est en train de faire (j'espère que cela ne compliquera pas trop votre réponse? Je ne me souviens pas de cela)

Était-ce utile?

La solution

Le goulot d'étranglement dans votre code est principalement lié à la couche base de données ADO / Access. Les fonctions au niveau du répertoire (FindFirst (), FindNext ()) sont relativement rapides. Vous pouvez vérifier si la base de données constitue le goulot d'étranglement en remplaçant ces appels par des instructions cout. Je suppose que les résultats seront transmis beaucoup plus rapidement à la console.

D'après mon expérience, Access n'est pas une base de données hautes performances et les pilotes ADO ne sont pas aussi rapides que les pilotes natifs. Je parie que si vous remplaciez la base de données par une base de données plus sérieuse, les performances seraient améliorées.

Autres conseils

Premièrement, il n’est pas nécessaire de supprimer / créer la table. Créez-le une fois, puis appelez "supprimer des images" lorsque vous souhaitez le réinitialiser. Deuxièmement - commentez "Form1- > ADOCommand1- > Execute ();" et voyez à quel point ça va vite. Cela indique si le problème réside dans l’enregistrement dans la base de données.

Si vous envisagez de développer des solutions sérieuses à l’avenir, je vous recommande de rechercher les meilleures solutions de base de données. (Firebird intégré, MySQL intégré, etc.).

Pour MySQL, il existe des composants CBuilder - très bons à utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top