Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/39: Рейтинг темы: голосов - 39, средняя оценка - 4.51
2 / 2 / 0
Регистрация: 12.09.2010
Сообщений: 35
1

функция FindFirst не работает как положено

14.06.2012, 20:14. Показов 6973. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такой кусок кода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
    if FindFirst('C:\*', faHidden, SR)=0 then
    begin
      ListBox1.Items.Add(SR.Name);
      while FindNext(SR) = 0 do
        begin
          if (SR.Attr and faDirectory)=faDirectory then
           begin
            FindRes := FindNext(SR);
            continue;
           end;
          ListBox1.Items.Add( SR.Name);  
      end
    end;
Он должен выводить все скрытые файлы на диске С, но выводит не скрытые,аналогично с другими атрибутами.
В чем ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2012, 20:14
Ответы с готовыми решениями:

SaveFileDialog не работает как положено
Добрый день уважаемые знатоки, Имеется оконное приложение. При нажатии на одну из кнопок на...

Диспетчер Realtek не работает как положено
Здравствуйте. В Диспетчере Realtek HD не работает меню Дополнительные настройки устройства,...

Почему addEventListener не работает как положено
<!DOCTYPE html> <html> <head> <title>Title of the document</title> </head> ...

Slackware mc - черный, клавиатура не работает как положено
Всем привет. Пробую по максимому облегчить дистрибутив. Начал с того что устоновил только базовую...

7
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
14.06.2012, 21:40 2
faReadOnly, faHidden, faSysFile, faVolumeID, faDirectory, faArchive, faSymLink, faAnyFile - это "дополнительные" атрибуты файлов. Если их не указать, то будут выбраны файлы, не имеющие этих атрибутов. А если эти атрибуты задать, то будут выбраны файлы не имеющие этих атрибутов и файлы имеющие эти атрибуты. Поэтому, если не задать атрибут faHidden, то будут выбраны файлы, не имеющие этот атрибут. А если faHidden задать, то будут выбраны и скрытые и не скрытые файлы.
Поэтому, убрать из выборки файлы, не имеющие дополнительных атрибутов, можно только с помощью дополнительной проверки.
Код будет таким:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  Sr : TSearchRec;
  Attr : Integer;
begin
  Attr := faAnyFile - faDirectory;
  try
    if FindFirst('C:\*', Attr, Sr) = 0 then
    repeat
      if (SR.Attr and faHidden) <> faHidden then Continue;
      ListBox1.Items.Add(Sr.Name);  
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
1
2 / 2 / 0
Регистрация: 12.09.2010
Сообщений: 35
14.06.2012, 22:56  [ТС] 3
Хорошо, как тогда отобразить файлы у которых несколько атрибутов, что-то как-то у меня не очень получается. То отображается лишь с одним атрибутом, то лишь с несколькими.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
procedure TForm1.Button2Click(Sender: TObject);
var
  SR: TSearchRec; // ïîèñêîâàÿ ïåðåìåííàÿ
  path: string;
  FindRes,  attr: Integer; // ïåðåìåííàÿ äëÿ çàïèñè ðåçóëüòàòà ïîèñêà
begin
  attr:=0;
  ListBox1.Clear;
  if CheckBox1.Checked =true  then
  begin
    attr:=attr + $02;
  end;
  if CheckBox2.Checked  then
  begin
    attr:=attr + $04;
  end;
    if CheckBox3.Checked  then
  begin
    attr:=attr + $20;
  end;
    if CheckBox4.Checked  then
  begin
    attr:=attr + $01;
  end;
  if not(CheckBox1.Checked) and not(CheckBox2.Checked) and not(CheckBox3.Checked) and not(CheckBox4.Checked) then
  begin
    attr:=$3f;
  end;
  //  showmessage(IntToStr(attr));
  path:=Edit1.Text;
  // î÷èñòêà êîìïîíåíòà ListBox1 ïåðåä çàíåñåíèåì â íåãî ñïèñêà ôàéëîâ
  path:=path + '\*';   //Èùåì âñå ôàéëû
  // çàäàíèå óñëîâèé ïîèñêà è íà÷àëî ïîèñêà
 
  //Attr := faAnyFile - faDirectory;
  try
    if FindFirst(path, attr, Sr) = 0 then
    repeat
      if (SR.Attr and attr) <> attr then Continue;
      ListBox1.Items.Add(Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
14.06.2012, 23:59 4
Я сейчас проверил на таком коде:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
var
  Sr : TSearchRec;
  Attr : Integer;
  Path : String;
begin
  Path := ExtractFilePath(ParamStr(0)) + 'Files\';
  Attr := faHidden + faReadOnly;
  try
    if FindFirst(Path + '*', Attr, Sr) = 0 then
    repeat
      if (SR.Attr and Attr) <> Attr then Continue;
      Memo1.Lines.Add(Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
Отрабатывает чётко - находит только те файлы, которые имеют атрибуты: faHidden и faReadOnly. Если точнее сказать - здесь находятся те файлы, которые обязательно имеют оба этих атрибута. Если хотя бы одного из этих атрибутов у файла нет, то такой файл не попадает в список.
1
2 / 2 / 0
Регистрация: 12.09.2010
Сообщений: 35
15.06.2012, 00:07  [ТС] 5
а без атрибутов файлы не показывает
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
15.06.2012, 00:08 6
Если нужно найти файлы, у которых установлен хотя бы один из атрибутов faHidden или (и) faReadOnly, то действовать надо так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Button1Click(Sender: TObject);
var
  Sr : TSearchRec;
  Attr : Integer;
  Path : String;
begin
  Path := ExtractFilePath(ParamStr(0)) + 'Files\';
  Attr := faHidden + faReadOnly;
  try
    if FindFirst(Path + '*', Attr, Sr) = 0 then
    repeat
      if not (
        ( (SR.Attr and faHidden) = faHidden )
        or ( (SR.Attr and faReadOnly) = faReadOnly ) )
      then Continue;
      Memo1.Lines.Add(Sr.Name);
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
Либо так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.Button1Click(Sender: TObject);
var
  Sr : TSearchRec;
  Attr : Integer;
  Path : String;
begin
  Path := ExtractFilePath(ParamStr(0)) + 'Files\';
  Attr := faHidden + faReadOnly;
  try
    if FindFirst(Path + '*', Attr, Sr) = 0 then
    repeat
      if
        ( (SR.Attr and faHidden) = faHidden )
        or ( (SR.Attr and faReadOnly) = faReadOnly )
      then begin
        Memo1.Lines.Add(Sr.Name);
      end;
    until FindNext(Sr) <> 0;
  finally
    FindClose(Sr);
  end;
end;
1
2 / 2 / 0
Регистрация: 12.09.2010
Сообщений: 35
15.06.2012, 05:32  [ТС] 7
а если нужно найти файлы, у которых установлены 2 атрибута, а а для поиска задаем один
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
15.06.2012, 07:55 8
В переменной Attr - каждый из первых 6-ти разрядов - один из признаков. И если поиск выполнен по атрибуту faHidden, то:
Delphi
1
If (Sr.Attr - faHidden) <> 0 Then //Кроме атрибута faHidden установлены ещё какие-то
А дальше можешь другой признак проверять:
Delphi
1
If (Sr.Attr And faReadOnly) <> 0 Then //Установлен атрибут faReadOnly
или
Delphi
1
If (Sr.Attr And faReadOnly) = faReadOnly Then //то же самое
Собственно - это двоичная арифметика.
Только faAnyFile - это сразу 4 разряда - нужно учитывать.
0
15.06.2012, 07:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2012, 07:55
Помогаю со студенческими работами здесь

Меню в Counter-Strike 1.6 работает не так, как положено
у меня вот такая ошибка в меню: если я нажимаю на что-то(кроме настроек) он подключается к...

Обертка для класса TRegistry не работает как положено
Работая с классом TRegistry сталкиваюсь со следующей проблемой: Пишу вот такую обертку h файл ...

Сериализация и десериализация в одном из методов не работает как положено
в двух классах есть методы сериализации и десериализации, в одном все работает нормально, во втором...

Что положено Юпитеру,не положено Быку
&quot;Что положено Юпитеру (греческому богу Зевсу ,не положено Быку&quot; откуда это высказывание и почему?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru