FindNext возвращает имена файлов, даже если используется только с faDirectory - PullRequest
4 голосов
/ 30 декабря 2011

Я пытаюсь перечислить все каталоги в данном каталоге. У меня есть этот код:

var
    srec: TSearchRec;

begin
    // folder is some absolute path of a folder
    if FindFirst(folder + PathDelim + '*', faDirectory, srec) = 0 then
        try
            repeat
                if (srec.Name <> '.') and (srec.Name <> '..') then
                    ShowMessage(srec.Name);
            until FindNext(srec) <> 0;
        finally
            FindClose(srec);
        end;

Но по какой-то причине я получаю сообщения об именах файлов, а не только о каталогах. Я думал, что использование faDirectory приведет к FindFirst, и семейство вернет только имена каталогов. Что я делаю неправильно? Если я изменю это на

if FindFirst(folder, faDirectory, srec) = 0 then

Тогда он показывает только имя folder, но не как абсолютный путь (относительно folder + '/..'), а затем завершает работу.

Я понимаю, что могу проверить, является ли это каталогом, убедившись, что (srec.Attr and faDirectory) = faDirectory, но я чувствую, что он делает все окольным путем, и должен быть правильный способ сделать это.

Ответы [ 3 ]

6 голосов
/ 30 декабря 2011

Если вы используете delphi xe, проверьте функцию TDirectory.GetDirectories.

Документация SysUtils.FindFirst содержит ответ на ваш вопрос.

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

Параметр Attr указывает специальные файлы для включения в дополнение на все нормальные файлы . Выберите из этих констант атрибута файла, когда указав параметр Attr.

4 голосов
/ 30 декабря 2011

Вы можете сделать что-то вроде этого:

var
  Dir: string;
begin
  for Dir in TDirectory.GetDirectories('c:\') do
    ShowMessage(Dir);
end;
1 голос
/ 18 июня 2015

Вы должны использовать фильтр для удаления файлов небольшие изменения в вашем коде

ваш код: folder + PathDelim + '*' изменить на

folder + PathDelim + '*.'
...