![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.