Apock
06-09-2012, 22:39
Есть следующая задача: получить из определённой папки список вложенных в неё папок(один уровень). В них находятся текстовые документы. Нужно, при нажатии на кнопку, внести в базу полные пути файлов и количество их строк из некоторых вложенных папок. Делается всё в С++ Builder 6.0.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *list = new TStringList; //для хранения содержимого файла
int cnt; //число строк в файле
int i=0; //для цикла while
DirectoryListBox1->Directory=direct; //установка начальной папки, заранее определённой в direct
while(i < DirectoryListBox1->Count)
{
dir=DirectoryListBox1->Items->Strings[i]; //берём по очереди названия вложенных папок
if(dir[1]='2') //нам нужны только папки, начинающиеся на "2"
{
FileListBox1->Directory=direct+"\\"+dir; //получаем список файлов в папке
for(int z=0; z<FileListBox1->Count; z++) //приступаем к их обработке
{
list->LoadFromFile(DirectoryListBox1->Directory+"\\"+FileListBox1->Items->Strings[z]); //получаем содержимое файла
cnt=list->Count; //считаем кол-во строк
ADOTable1->Insert(); //добавляем данные в базу
ADOTable1->FieldByName("FilePath")->AsString=DirectoryListBox1->Directory+"\\"+FileListBox1->Items->Strings[z];
ADOTable1->FieldByName("Lines")->AsInteger=cnt;
ADOTable1->Post();
}
}
i++;
}
}
Проблема в том, что в базу вносятся только файлы из первой папки, начинающейся с "2". В моём случае таких папок 5. Думал проблема с вложенными циклами(изначально оба были for). Поменял на while - не помогло.
Поставил в конце первого цикла вывод переменной i на Label и секундную паузу, чтоб проследить за выполнением цикла. DirectoryListBox1 содержит 11 папок. При запуске цикла программа некоторое время не отвечает, затем цикл закрывается, на Label цифра 7, а в базе опять таки те же файлы из первой папки.
В принципе проблема решается разделением циклов. Делаем, к примеру, скрытый компонент Memo. В него вносим названия папок первым циклом. Вторым уже пробегаемся по файлам. Так работает, но мне такой подход кажется нерациональным. И интересно всё-таки, что ж за загвоздка в данном коде?
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *list = new TStringList; //для хранения содержимого файла
int cnt; //число строк в файле
int i=0; //для цикла while
DirectoryListBox1->Directory=direct; //установка начальной папки, заранее определённой в direct
while(i < DirectoryListBox1->Count)
{
dir=DirectoryListBox1->Items->Strings[i]; //берём по очереди названия вложенных папок
if(dir[1]='2') //нам нужны только папки, начинающиеся на "2"
{
FileListBox1->Directory=direct+"\\"+dir; //получаем список файлов в папке
for(int z=0; z<FileListBox1->Count; z++) //приступаем к их обработке
{
list->LoadFromFile(DirectoryListBox1->Directory+"\\"+FileListBox1->Items->Strings[z]); //получаем содержимое файла
cnt=list->Count; //считаем кол-во строк
ADOTable1->Insert(); //добавляем данные в базу
ADOTable1->FieldByName("FilePath")->AsString=DirectoryListBox1->Directory+"\\"+FileListBox1->Items->Strings[z];
ADOTable1->FieldByName("Lines")->AsInteger=cnt;
ADOTable1->Post();
}
}
i++;
}
}
Проблема в том, что в базу вносятся только файлы из первой папки, начинающейся с "2". В моём случае таких папок 5. Думал проблема с вложенными циклами(изначально оба были for). Поменял на while - не помогло.
Поставил в конце первого цикла вывод переменной i на Label и секундную паузу, чтоб проследить за выполнением цикла. DirectoryListBox1 содержит 11 папок. При запуске цикла программа некоторое время не отвечает, затем цикл закрывается, на Label цифра 7, а в базе опять таки те же файлы из первой папки.
В принципе проблема решается разделением циклов. Делаем, к примеру, скрытый компонент Memo. В него вносим названия папок первым циклом. Вторым уже пробегаемся по файлам. Так работает, но мне такой подход кажется нерациональным. И интересно всё-таки, что ж за загвоздка в данном коде?