![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Объясните, где ошибка? [D4, WinME]
Kolya © (2002-06-30 00:45:00)
function TForm1.GetDirs(dir:string):tstringlist;
var
ts: TSearchRec;
begin
result:=tstringlist.create;
if findfirst(dir+ "*", fadirectory,ts)=0 then
repeat
if (ts.name <> ".") and (ts.name <> "..") then
result.add(ts.name);
until findnext(ts)<>0;
findclose(ts);
end;
по идее фунция должна была бы показывать только папки, но она выдает файлы и папки. Что надо изменить?
Спасибо.
Kolya (2002-07-01 01:25:00) [1]Спасибо огромное, замечательно, теперь все понятно.. Это я не дочитал справку и думал, что параметр fadirectory выдаст только папки.
Anatoly Podgoretsky (2002-06-30 18:15:00) [2]Юрий Зотов © (30.06.02 17:59)
Теперь понял, что ты имел ввиду, это относится к шеллу, возврат на несколько уровней выше по количеству точек
Юрий Зотов (2002-06-30 17:59:00) [3]> Насчет "..." каталогов
Это "родитель родителя". Нынешние Win32 такую запись понимают. Не знаю, хранится ли такая ссылка в самом каталоге, но во всяком случае в командной строке это срабатывает - именно так, как сказано в документации. Поэтому надежнее учесть.
Что же касается остального, то вся эта дискуссия не стоит и выеденного яйца - проверять битовые флаги, надеюсь, умеют все. Причем с учетом условий задачи.
GobliNGuT (2002-06-30 14:09:00) [4]MBo:
>>надежнее всего проверка
>>if ((ts.Attr and faDirectory)= faDirectory) and ...
>>поскольку простая проверка на равенство подведет, например, >>для скрытой директории
Вот мой вариант проверки, меня он не подводил. В этом варианте проверяется только наличие флага каталога, а остальные - неважно.
А перед условием стоит искать все файлы. И этим условием фильтровать нужное.
if (sr.Attr and faDirectory)<>0 then ...
И будет все ...
Anatoly Podgoretsky (2002-06-30 12:23:00) [5]kull © (30.06.02 02:07)
Ты видишь что у меня это обозначено жирным + папки
Юрий Зотов © (30.06.02 07:17)
Не согласен, надо все таки проверять как у автора "." и ".." отдельно, иначе не попадут каталоги .ХХХ, ну и про точное равенство аттрибутов MBO указал, конечно можно согласиться с товоим доводом, что ему нужны только обычные каталоги, но я думаю, что у него просто неточная постановка вопроса.
Насчет "..." каталогов, не прояснишь, а то что то я на это ни разу нигде не натыкался.
Юрий Зотов (2002-06-30 09:14:00) [6]Вообще - да, но не в данном случае.
Он не ищет скрытые, read-only и пр. директории, поэтому у него возможно либо равенство, либо не директория. И ничего другого.
MBo (2002-06-30 08:57:00) [7]надежнее всего проверка
if ((ts.Attr and faDirectory)= faDirectory) and ...
поскольку простая проверка на равенство подведет, например, для скрытой директории
Юрий Зотов (2002-06-30 07:17:00) [8]Еще момент - современные Win32 "знают" еще и "дедовский" каталог (три точки). При проверке, пожалуй, стоит учесть и это. В итоге получаем примерно следующее:
if (ts.Attr = faDirectory) and (ts.name[1] <> ".") then ...
Aleks1 (2002-06-30 03:47:00) [9]kull © (30.06.02 02:07)
Для того, чтобы функция поиска файлов искала еще и директории (каталоги, папки, мамки , и т.п.)
kull (2002-06-30 02:07:00) [10]
> Anatoly Podgoretsky © (30.06.02 01:23)
А зачем в параметре поиска тогда нужен атрибут fadirectory?
Anatoly Podgoretsky (2002-06-30 01:23:00) [11]Это не ошибка, выдаются все обычные файлы + папки, как ты заказал
Надо анализировать атттриюут и брать только папки, игнорируя обычные файлы, кроме того у тебя есть еще ошибка, покажет не все папки, например не покажет read only, hidden таковы у тебя флаги, надо заменить на faAnyFile