Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

TSearchRec   Найти похожие ветки 

 
harisma   (2007-06-22 17:17) [0]

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


 
Dimaxx ©   (2007-06-23 03:18) [1]

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


 
palva ©   (2007-06-23 09:16) [2]

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


 
Anatoly Podgoretsky ©   (2007-06-23 12:23) [3]

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

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


 
Anatoly Podgoretsky ©   (2007-06-23 12:24) [4]

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

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


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

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

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;


 
Dimaxx ©   (2007-06-23 16:41) [6]


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

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


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


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


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


 
Dimaxx ©   (2007-06-25 14:35) [8]

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


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

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

   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 - некоторая функция, выполняющая сохранение имен найденых файлов в моей структуре.


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

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


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

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


 
clickmaker ©   (2007-06-25 15:18) [12]


> [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;


 
Anatoly Podgoretsky ©   (2007-06-25 15:31) [13]

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


 
Desdechado ©   (2007-06-25 15:56) [14]

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


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

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

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


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

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

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

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


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

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

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


 
clickmaker ©   (2007-06-25 16:58) [18]


> [17] harisma   (25.06.07 16:44)

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


 
Anatoly Podgoretsky ©   (2007-06-25 17:04) [19]

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.07.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
1-1179322890
webpauk
2007-05-16 17:41
2007.07.22
Получение размера иконок


2-1182843090
Aragorn
2007-06-26 11:31
2007.07.22
Create(nil)


15-1182586025
Predfer
2007-06-23 12:07
2007.07.22
Как убрать процесс из автозагрузки?


3-1176570004
Надежда
2007-04-14 21:00
2007.07.22
Update Null полей


1-1179395882
Infinityx93
2007-05-17 13:58
2007.07.22
Реакция combobox