Qual é a melhor maneira de criar um banco de dados de acesso de nomes de arquivo usando C ++ Builder?

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

Pergunta

Última pergunta para a noite. E desculpas para a noobness completa deste.

Eu tenho, com a ajuda do stackoverflow e Google alcançado o seguinte ...

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;
}

É basicamente percorrer um determinado diretório e seus subdiretórios, e adicionando cada arquivo (com trajeto) para um banco de dados MS Access.

(Eu sou o único usuário assim que eu não me importo muito com a segurança)

Com um grande número de arquivos este código é terrivelmente lento. Alguém pode descrever uma maneira melhor de fazer o que o código está fazendo, (espero sem fazer a sua resposta muito complicado. Eu sou um noob a esta lembrar)

Foi útil?

Solução

O gargalo no seu código é muito provavelmente a camada de banco de dados ADO / Access. As funções de nível de diretório (FindFirst (), FindNext ()) são relativamente rápido. Você poderia verificar se o banco de dados é o gargalo, substituindo as chamadas com declarações cout. Meu palpite é que ele vai correr muito mais rápido quando a saída de resultados para o console.

Na minha experiência, o Access não é um banco de dados de alto desempenho, e os drivers ADO não são tão rápidas como drivers nativos. Aposto que se você substituiu o banco de dados com um banco de dados mais sério, você encontraria um melhor desempenho.

Outras dicas

Em primeiro lugar - não há queda de necessidade / criar a tabela. Criá-lo uma vez e, em seguida, chamar de "apagar das imagens", quando quiser para redefini-la. Segundo - comentário fora "Form1-> ADOCommand1-> Executar ();" e ver o quanto mais rápido ele fica. Isso mostra se o problema é em salvar no banco de dados.

Se você pretende desenvolver algumas coisas sérias no futuro, então eu recomendo a olhar uma rodada de melhores soluções de banco de dados. (Firebird incorporado, MySQL embutido, etc).

Para o MySQL há CBuilder componentes -. Muito bom para uso

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top