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

Вниз

Поиск файла в подкаталогах.   Найти похожие ветки 

 
М   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.054 c
2-1340649651
Pcrepair
2012-06-25 22:40
2013.03.22
Проблема с вводом-выводом данных через параметры процедуры


15-1346949003
Опять я
2012-09-06 20:30
2013.03.22
Вопрос по Яндекс-почте.


2-1335338531
Avers
2012-04-25 11:22
2013.03.22
Передача фокуса элементу


15-1349298953
Дмитрий С
2012-10-04 01:15
2013.03.22
Как называется разъем?


15-1352384190
Artem
2012-11-08 18:16
2013.03.22
Можно ли сменить размер виртуального диска в VirtualBox?