Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2009, 17:17   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Корректный сёрчинг файлов и папок

Привет всем!
Вот у меня такое дело, короче надо получить все файлы из папки.
Использую findFirst, посмотрел список атрибутов:
Цитата:
faReadOnly = $00000001 platform;
faHidden = $00000002 platform;
faSysFile = $00000004 platform;
faVolumeID = $00000008 platform deprecated; // not used in Win32
faDirectory = $00000010;
faArchive = $00000020 platform;
faSymLink = $00000040 platform;
faNormal = $00000080 platform;
faTemporary = $00000100 platform;
faAnyFile = $000001FF;
Написал так:
Код:
function getFilesFromDir(const dir: string; const list: tStringList): boolean;
var
sr: tSearchRec;
begin
   if findFirst(dir+'\*.*', faAnyFile, sr) = 0 then
   repeat
      if (sr.Name = '.') or (sr.Name = '..') or (sr.Attr = faDirectory) then continue;

      list.Add(format('%x', [sr.Attr])+ ' - '+dir+'\'+sr.Name);
   until findNext(sr) <> 0;
   findClose(sr);
end;
Проблема в том, что он не всегда всё делает правильно. Т.е. он цапает такую папку, как C:\windows\fonts

Столько атрибутов там, какой для чего, чёрт его знает
Если искать файлы, с конкретным расширением, то всё ОК, а так нет. Как мне из sr.attr точно узнать, это папка, или файл, и какая она или он, крытый, системный обычный
Altera вне форума Ответить с цитированием
Старый 18.06.2009, 17:23   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

C:\windows\fonts, если присмотрется то это не совсем папка то...
видимо особые папки он цепляет
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.06.2009, 21:44   #3
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

У вас ошибочка вот здесь
Цитата:
(sr.Attr = faDirectory)
Папка, например, может быть скрытой (faHidden), поэтому у неё значение st.Attr будет равно не faDurectory, а (faDirectory or faHidden)=$00000012. Проверять надо так
Код:
if (sr.Name = '.') or (sr.Name = '..') or ((SR.Attr and faDirectory)<>0) then ...
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 19.06.2009, 07:43   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Тогда можно и так написать:
Код:
if (sr.Attr and faDirectory) = faDirectory then continue;
Но всёравно, Респект +
Altera вне форума Ответить с цитированием
Старый 20.02.2011, 14:41   #5
Harikolo
Пользователь
 
Аватар для Harikolo
 
Регистрация: 27.09.2010
Сообщений: 17
По умолчанию

Здравствуйте.
Решил написать сюда...
Есть код:
Код:
Begin
                                  ListBox1.Clear;
                                  FindRes := FindFirst('D:\*.txt', faHidden, SR);
                                  while FindRes = 0 do
                                  begin
                                    ListBox1.Items.Add(SR.Name);
                                    FindRes := FindNext(SR);
                                  end;
                                  FindClose(SR);
                               end;
На мой взгляд этот код должен искать все скрытые txt файлы в диске D, но этого не происходит в ListBox выводятся все txt файлы.
Harikolo вне форума Ответить с цитированием
Старый 20.02.2011, 14:51   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
Begin
                                  ListBox1.Clear;
                                  FindRes := FindFirst('D:\*.txt', faHidden, SR);
                                  while FindRes = 0 do
                                  begin
                                    if (sr.Attr and faHidden) = faHidden ListBox1.Items.Add(SR.Name);
                                    FindRes := FindNext(SR);
                                  end;
                                  FindClose(SR);
                               end;
всего лишь то.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.02.2011, 15:27   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Harikolo Посмотреть сообщение
На мой взгляд этот код должен искать все скрытые txt файлы в диске D, но этого не происходит в ListBox выводятся все txt файлы.
Меня всегда интересует, откуда вы берёте все эти оригинальные трактовки функций.

Нажимаем F1 и видим, что чёрному по белому написано:

Цитата:
The Attr parameter specifies the special files to include in addition to all normal files.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.02.2011, 19:37   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
C:\windows\fonts, если присмотрется то это не совсем папка то...
Цитата:
faReadOnly : 1 : Файл только для чтения
faHidden : 2 : Скрытый файл
faSysFile : 4 : Системный файл
faVolumeID : 8 : Файл идентификатора объёма
faDirectory : 16 : Файл директории
faArchive : 32 : Архивный файл
faSymLink : 64 : Ярлык
может поздно но попробуи проверить faSysFile : 4 : Системный файл

и вообше поюзаи все параметры, пока не наидеш тот что перекроет условие попадание
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема. Поиск папок и файлов. Delphi7 Lancer Помощь студентам 3 09.04.2009 21:21
поиск файлов и папок FAiver Общие вопросы Delphi 13 09.04.2009 18:01
Получить список файлов и папок. gusluk Общие вопросы Delphi 3 10.03.2009 12:49
Отображение скрытых файлов и папок и отображение розширения всех файлов beegl Общие вопросы Delphi 10 14.12.2008 22:02
список всех открытых файлов и папок. Teleport Общие вопросы Delphi 4 22.06.2008 11:29