Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.074 c
2-1337971927
Den
2012-05-25 22:52
2013.03.22
Передать VK_LBUTTON в функцию?


2-1336042324
Vik
2012-05-03 14:52
2013.03.22
Incompatible types: String and Integer


2-1337694534
toropoff
2012-05-22 17:48
2013.03.22
ADO


15-1347568203
Юрий
2012-09-14 00:30
2013.03.22
С днем рождения ! 14 сентября 2012 пятница


15-1337354166
Дуремар
2012-05-18 19:16
2013.03.22
Сломал клаву?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский