Получить путь и имя файла всех файлов в данном каталоге и его подкаталогах - PullRequest
0 голосов
/ 19 января 2009

Мне дали этот код некоторое время назад. Наконец-то я приступил к его тестированию (с некоторыми изменениями, чтобы поместить файлы в другое место) ...

void AddFiles(AnsiString path/*, TDataSet *DataSet*/)
{
TSearchRec sr;
int f;
    f = FindFirst(path+"\\*.*", faAnyFile, sr);
    while( !f )
    {
        if(sr.Attr & faDirectory)
        {
                if(sr.Name != "."   &&   sr.Name != "..")
                {
                        path.sprintf("%s%s%s", path, "\\", sr.Name);
                        AddFiles(path/*, DataSet*/);
                }
        }
        else
        {
                Form1->ListBox1->Items->Add(path+ "\\"+ sr.Name);
                //DataSet->Append();
                //DataSet->FieldByName("Name")->Value = sr.Name;
                /* other fields ... */
                //DataSet->Post();
        }
        f = FindNext(sr);
    }
    FindClose(sr);
}

Это не работает должным образом. В начале это перепутано ..

реальная структура ...

корень корень \ subdir1 корень \ subdir2 корень \ subdir3

запутался вот так ...

корень корень \ subdir1 корень \ subdir1 \ subdir2 корень \ subdir1 \ subdir2 \ subdir3

и в конечном итоге он перестает включать корневые или вложенные \ sub-папки, а 'path' просто содержит подпапку (без корневых папок)

это абсолютно бесполезно для получения пригодных имен файлов полного пути.

так что либо можете ли вы сказать мне, где код идет не так ... или дайте мне несколько советов о том, как получить полный путь к файлам в каталоге и всех его подкаталогах .

Я хочу, чтобы это было как можно более простым. то есть нет необычных расширенных возможностей C ++. вещи, которые noob-строитель, скорее всего, сможет отлаживать.

1 Ответ

4 голосов
/ 19 января 2009

Здесь вы добавляете каждый подпуть к текущему пути:

path.sprintf("%s%s%s", path, "\\", sr.Name);
AddFiles(path/*, DataSet*/);

Используйте новую переменную для комбинированного пути, чтобы не перепутать переменную path, которая по-прежнему нужна для остальных файлов / каталогов в каталоге:

AnsiString subpath;
subpath.sprintf("%s%s%s", path, "\\", sr.Name);
AddFiles(subpath/*, DataSet*/);
...