Получить путь и имя файла всех файлов в данном каталоге и его подкаталогах

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

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

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

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

root root \ subdir1 root \ subdir2 root \ subdir3

запутался, как это...

root root \ subdir1 root \ subdir1 \ subdir2 root \ subdir1 \ subdir2 \ subdir3

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

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

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

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

1 ответ

Решение

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

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*/);
Другие вопросы по тегам