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

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

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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' просто содержит вложенную папку (без ее корневых папок)

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

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

Я хочу, чтобы это было как можно более простым.т. е.никаких необычных расширенных функций c ++.материал, который новичок-строитель, скорее всего, сможет отладить.

Это было полезно?

Решение

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

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*/);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top