Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TSearchRec [D5, Win2k]


harisma ©   (2007-06-22 17:17:00) 

Как мне задать условие поиска только не ReadOnlyфайлов. Почему-то указание аттрибута faAnyFile and not faReadOnly для функции FindFirst не срабатывает.


Anatoly Podgoretsky   (2007-06-25 17:04:00) [1]

> harisma  (25.06.2007 16:44:17)  [17]

А нам прикажешь догадываться?
Не тема а базар, ничего предметного.


clickmaker   (2007-06-25 16:58:00) [2]


> [17] harisma   (25.06.07 16:44)

давно бы уже сделал как в [12]
непродуктивный базар


harisma   (2007-06-25 16:44:00) [3]

> Вот сразу и получили ошибку, попробуй сделать заявленую у тебя конкатенацию.

Ответ не в тему. Я знаю, что корневая директория должна заканчиваться символом '\'.  Проблема в том, что я не могу отфильтровать не ReadOnly файлы стандартными методами, а вы мне всякую ерунду про параметры и их значения толкуете.


Anatoly Podgoretsky   (2007-06-25 16:35:00) [4]

> harisma  (25.06.2007 16:09:15)  [15]

> А какая разница, какие значения передаются, кроме значения аттрибутов? Подставьте любую корневую директорию, например С:\WinNT\system32 и задайте маску *.*.

Вот сразу и получили ошибку, попробуй сделать заявленую у тебя конкатенацию.


harisma   (2007-06-25 16:09:00) [5]

> [13] Anatoly Podgoretsky (25.06.07 15:31)
А какая разница, какие значения передаются, кроме значения аттрибутов? Подставьте любую корневую директорию, например С:\WinNT\system32 и задайте маску *.*.

> [14] Desdechado (25.06.07 15:56)
В D5 код такой-же, однако находит все файлы подряд, включая и имеющие аттрибут ReadOnly, а вот именно они то мне и не нужны.


Desdechado   (2007-06-25 15:56:00) [6]

> Похоже, что это баг. Смотрим вместе:
В D7 все корректно:
 F.ExcludeAttr := not Attr and faSpecial;


Anatoly Podgoretsky   (2007-06-25 15:31:00) [7]

А значения мы должны сами придумывать.


clickmaker   (2007-06-25 15:18:00) [8]


> [11] harisma   (25.06.07 15:14)

hFind := FindFirstFile(LDIR + LMasks[i], wfd);
if (hFind <> INVALID_HANDLE_VALUE) then begin
 repeat
   if ((wfd.dwFileAttributes and FILE_ATTRIBUTE_READONLY) = 0) then
     // наш файл

 until not FindNextFile(hFind, wfd);
end;


harisma   (2007-06-25 15:14:00) [9]

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


Anatoly Podgoretsky   (2007-06-25 14:57:00) [10]

Об остальном мы должны сами догадаться


harisma   (2007-06-25 14:55:00) [11]

Ясно. Тогда вот фрагмент кода:

   for i := 0 to Length(LMasks) - 1 do
     if (FindFirst(LDIR + LMasks[i], AAttr and (not faDirectory), LSR) = 0) then
     try
       repeat
         AEnumPathFunc(LDIR, LSR, AAdditionalInfo);
       until not (FindNext(LSR) = 0);
     finally
       FindClose(LSR);
     end;

где:
 LMasks - стринговый массив масок файлов. Возьмем для простоты из одного элемента ('*.*')
 LDIR - корневая директория
 LSR - TSearchRec
 AAttr = мой набор аттрибутов файлов, которые надо найти (faAnyFile and not faReadOnly) (передается извне)
 AEnumPathFunc - некоторая функция, выполняющая сохранение имен найденых файлов в моей структуре.


Dimaxx   (2007-06-25 14:35:00) [12]

Это стандартный ответ, когда не видя код нельзя со 100% уверенностью сказать где ошибка. Приведи код - посмотрим...


harisma   (2007-06-25 14:19:00) [13]


> Ошибка в 17 строке


Что Вы имели ввиду? Что это за 17 строка?


Dimaxx   (2007-06-23 16:41:00) [14]


> Ты не понял вопроса или не понимаешь как работает ДОС и
> его наследники и Паскаль

А по одной строке не понять что именно автор хотел спросить. Какой вопрос - такой ответ... :)


Инс   (2007-06-23 15:28:00) [15]

Такой код действительно не работатет.

procedure TForm1.Button1Click(Sender: TObject);
var
 Rec: TSearchRec;
begin
 if FindFirst('C:\*.*',faAnyFile and (not faReadOnly),Rec) = 0 then begin
   try
     repeat
       ListBox1.AddItem(Rec.Name,nil);
     until FindNext(Rec) <> 0;
   finally
     FindClose(Rec);
   end;
 end;
end;


Похоже, что это баг. Смотрим вместе:

function FindFirst(const Path: string; Attr: Integer;
 var  F: TSearchRec): Integer;
const
 faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
{$IFDEF MSWINDOWS}
begin
 // Что означает следующая строчка? Следовало бы сделать так:
 // F.ExcludeAttr := not Attr; Иначе атрибуты, не входящие в faSpecial
 // никогда не попадут в список исключаемых
 F.ExcludeAttr := not Attr and faSpecial;
 F.FindHandle := FindFirstFile(PChar(Path), F.FindData);
 if F.FindHandle <> INVALID_HANDLE_VALUE then
 begin
   Result := FindMatchingFile(F);
   if Result <> 0 then FindClose(F);
 end else
   Result := GetLastError;
end;


Anatoly Podgoretsky   (2007-06-23 12:24:00) [16]

> Dimaxx  (23.06.2007 03:18:01)  [1]

Ты не понял вопроса или не понимаешь как работает ДОС и его наследники и Паскаль


Anatoly Podgoretsky   (2007-06-23 12:23:00) [17]

> harisma  (22.06.2007 17:17:00)  [0]

Ошибка в 17 строке


palva   (2007-06-23 09:16:00) [18]

> Почему-то указание аттрибута faAnyFile and not faReadOnly для функции FindFirst не срабатывает.
Странно, должно срабатывать. Может быть в чем-то другом ошибка?


Dimaxx   (2007-06-23 03:18:00) [19]

Надо (Attr and faReadOnly)<>faReadOnly.


Наверх

Титульная страница Поиск, карта сайта Написать письмо