Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизПоиск файла в подкаталогах. Найти похожие ветки
← →
М (2012-05-31 20:25) [0]Пытаюсь сделать поиск файла (первого попавшегося)
в каталоге и под, но FName возвращает "Unknown".
Где ошибка?
var
FName: string = "Unknown";
function Scan(Directory, Name: string): boolean;
var
Desc: TSearchRec;
begin
Result:= False;
If (FindFirst(Directory + Name, faAnyFile, Desc) = 0) then
try
repeat
If ((Desc.Attr and faDirectory) = faDirectory) then
begin
If not (Desc.Name = "..")
then Scan(IncludeTrailingPathDelimiter(Directory + Desc.Name), Name);
end else
begin
FName:= Directory + Desc.Name;
Result:= True;
Exit;
end;
until (FindNext(Desc) <> 0);
finally
FindClose(Desc);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ScanFile("E:\", "rammstein.ttf");
Caption:= FName;
end;
Еще хотел спросить:
1) Слэш между директориями должен быть одинарным или "\\" таким тоже?
В некоторых примерах 2-й вариант.
2) Что означает нашли файл с именем "."?
С ".." понятно, получается мы при поиске можем наткнуться на каталог верхнего уровня и туда случайно зайти. Так? Его нужно игнорировать.
← →
MBo © (2012-05-31 20:32) [1]> файл с именем "."?
текущая папка
← →
М (2012-05-31 20:36) [2]Её тоже нужно игнорировать чтобы не произошел deadlock?
← →
Ega23 © (2012-05-31 20:47) [3]
> Её тоже нужно игнорировать чтобы не произошел deadlock?
Её можно игнорировать. А можно - нет. Зависит от логики работы твоего кода, не более.
← →
М (2012-05-31 20:49) [4]Да, изменил условие.
If not ((Desc.Name = ".") and (Desc.Name = ".."))
then Scan(IncludeTrailingPathDelimiter(Directory + Desc.Name), Name);
← →
М (2012-05-31 21:13) [5]
> Ega23 © (31.05.12 20:47) [3]
Поиск файла в каталоге и его подкаталогах.
← →
Ega23 © (2012-05-31 21:21) [6]
> Поиск файла в каталоге и его подкаталогах.
нет.
← →
М (2012-05-31 21:27) [7]Что "нет"?
В текущем каталоге прекрасно ищет.
А в подкаталоги почему-то заходить не хочет.
← →
Ega23 © (2012-06-01 00:03) [8]
> Что "нет"?
А что "Поиск файла в каталоге и его подкаталогах"?
← →
М (2012-06-01 02:30) [9]
> Ega23 © (01.06.12 00:03) [8]
Есть папка A, в ней папки X, Y, Z. (Подкаталоги) В Z лежит файл rammstein.ttf.
Директорией указываем A и запускаем поиск rammstein.ttf.
Что не понятного?
← →
Германн © (2012-06-01 02:49) [10]
> М (31.05.12 20:49) [4]
>
> Да, изменил условие.
> If not ((Desc.Name = ".") and (Desc.Name = ".."))
Булеву алгебру советую заново изучить. Ну и подумать мозгами "как может Desc.Name одновременно равняться "." и ".." "?
← →
М (2012-06-01 17:24) [11]Это опечатка.
← →
btf (2012-06-01 22:37) [12]If not (Desc.Name = "..")
then Scan(IncludeTrailingPathDelimiter(Directory + Desc.Name), Name);
нужно
If not (Desc.Name = "..") then begin
Result := Scan(IncludeTrailingPathDelimiter(Directory + Desc.Name), Name);
if Result then Break;
end;
← →
М (2012-06-02 01:25) [13]
> btf (01.06.12 22:37) [12]
Все равно не пашет.
В текущем каталоге прекрасно ищет.
← →
Германн © (2012-06-02 02:09) [14]
> М (02.06.12 01:25) [13]
>
>
> > btf (01.06.12 22:37) [12]
>
>
> Все равно не пашет.
>
Приведи последнюю версию кода. А то может в ней опечаток больше чем самого кода. :)
← →
М (2012-06-02 02:16) [15]Все. Сделал:
function ScanFile(const ADirectory, AMask: string; var FileName: string; var Info: TSearchRec): boolean;
function Scan(const Directory, Mask: string): boolean;
var
Desc: TSearchRec;
begin
Result:= False;
If (FindFirst(Directory + Mask, faAnyFile, Desc) = 0) then // Поиск в каталоге.
try
repeat
If ((Desc.Attr and faDirectory) <> faDirectory) then
begin
Info := Desc;
FileName:= Directory + Desc.Name;
Result:= True;
Exit;
end;
until (FindNext(Desc) <> 0);
finally
FindClose(Desc);
end;
If (FindFirst(Directory + "*", faAnyFile, Desc) = 0) then // Поиск в каталогах.
try
repeat
If ((Desc.Attr and faDirectory) = faDirectory) and not ((Desc.Name = ".") or (Desc.Name = "..")) then
begin
Result:= Scan(IncludeTrailingPathDelimiter(Directory + Desc.Name), Mask);
If Result then Exit;
end;
until (FindNext(Desc) <> 0);
finally
FindClose(Desc);
end;
end;
begin
Result:= Scan(ADirectory, AMask);
end;
Только программа виснет.
Как это решить?
← →
sniknik © (2012-06-02 12:23) [16]> Как это решить?
если программа виснет, то переписав все без ошибок...
а вот если работает долго (подвисает интерфейс), то переписать с использованием потока.
← →
М (2012-06-02 13:12) [17]
> sniknik © (02.06.12 12:23) [16]
Ну да, виснет из-за долгого поиска.
А с помощью этого потока можно включать/отключать поиск?
(Думаю убивая его (поток))
← →
Медвежонок Пятачок © (2012-06-02 13:15) [18]убивать не надо. можно просто подать на него в суд
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.075 c