Търсете файлове в Delphi, Delphi, компоненти на Delphi, източници на Delphi

Намиране на файлове в Delphi

Помислете за следния пример:

hFindFile: = FindFirst (маска за търсене, атрибути, информация);

// Проверяваме верността на намерения файл

ако hFindFile за INVALID_HANDLE_VALUE тогава

// Ако е правилно, цикълът започва да се повтаря - до, повторете

// Ето извлеченията, които трябва да бъдат изпълнени, докато (FindNext (Информация) около 0);

Намерете първи - отваря търсене. Първият параметър е маската за търсене. Ако посочите конкретен файл, системата ще го намери точно. Ти си толкова­можете също да търсите цели групи файлове. Например можете да търсите всички файлове в основната директория на C: устройството. За това първият параметър трябва да е оп­Определя се като— 'с: \ *. *". За да търсите само EXE файлове, в папката Fold трябва да посочите - 'c: \ Сгъване \ *. бивш.

Вторият параметър са атрибутите, използвани при търсене на файлове. За да търсите каквито и да е файлове, трябва да посочите faAnyFiie. Освен това можете да търсите, като следвате­следните атрибути:

  • faReadOnly - търсене на файлове с атрибут Readonly (само за четене);
  • faHidden - търсене на скрити файлове;
  • faSysFile - търсене на системни файлове;
  • faArchive - търсене в архивни файлове;
  • faDirectory - търсене в папки.

Последният параметър е структура, в която ще ни бъде върната информация за търсенето, а именно: името на намерения файл, размер, време на създаване и т.н.

След като извикаме тази процедура, трябва да проверим верността на намереното­файл. Ако резултатът е invalid_handle_value, тогава функцията не намери файлове. Ако всичко е наред и съществува файл, който отговаря на критериите за търсене, тогава цикълът започва Повторете . .докато.

Вече разгледахме циклите, но все пак ще повторим и ще запомним тяхната работа. Цикълът изпълнява операторите между повторение и докато не е изпълнено условието след докато. Веднага щом условието е нарушено, цикълът се прекъсва.

Тук трябва да се отбележи, че функцията за търсене връща имена на файлове чрез параметъра Information и може да ни върне период или два периода като име. Ако погледнете папката, няма да има такива файлове. Откъде идват тези имена? Името на файла с точки показва текущата папка, а името на файла с двойни точки показва­отива в папката от най-високо ниво. Ако срещнем такива имена, тогава те трябва да бъдат­сто изхвърляне.

Параметърът за информация е от типа структура TSearchRec. Нека да го разгледаме по-отблизо. Рекламата изглежда така:

TSearchRec = Време на запис: Цяло число; // Време за създаване на намерения файл

Размер: Цяло число; // Размер на намерения файл

Attr: Цяло число; // Атрибути на намерения файл

Име: TFileName; // Име на намерения файл

ExcludeAttr: Integer; // Изключени атрибути на намерения файл

FindHandle: THandle; // За търсене се изисква указател

F.inddata: TWin32FindData; // Структура за търсене на файлове на Winndows

Функцията FindNext принуждава да намери следващия файл, съответстващ на двойката­метри, посочени във функцията Намерете първи. Тази функция трябва да бъде предадена на структурата searchRec, която ще определи къде е спряно търсенето и от този момент тя ще продължи. Веднага щом бъде намерен нов файл, функцията ще върне информация за новооткрития файл в структурата на SearchRec.

Findciose затваря търсенето. Като единствен параметър се нуждаем­но посочете същата структура на SearchRec.

Нека напишем пример от реалния свят, който демонстрира как се работи с функциите за търсене на файлове. Вижте структурата TSearchRec. Как vi­dite, той знае как да върне размера на намерения файл. Ето тема за пример - ще напишем код, който ще определи размера на посочения файл.

Създайте нов проект и инсталирайте два компонента TEdit и един бутон във формуляра. Можете също така да украсите всичко това с текст. Трябва да имате нещо подобно­подобно на фиг. 10.4.

При щракване върху бутона (събитие onclick) напишете следния код:

SearchRec: TSearchRec; begin // Търси се файл

ако FindFirst (Editl.Text, faAnyFile, SearchRec) = 0 тогава

Edit2.Text: = IntToStr (SearchRec. Size) + 'байт';

// Затваряме търсенето FindClose (SearchRec); край;

Нека усложним примера и се опитаме да напишем програма, която ще търси файл на диска, като същевременно сканира и подпапки. Тази задача е много удобна за­преминават през рекурсия. Когато разгледахме тази тема, внедрихме напълно безполезен пример, който е най-добре решен чрез обикновен цикъл. В този случай ще видите истинската сила на рекурсията, ще консолидирате знанията си за функциите за търсене и ще видите добър алгоритъм.

Така например, ние се нуждаем от две полета за въвеждане с имена във формуляра:

  • edLookFor - в него ще бъде въведено името на файла, който ще бъде намерен;
  • edLookin е устройството или пътят до папката, където искате да търсите, включително подпапки. Ще ни трябва и бутон, който да сканира­нормиране и полето за въвеждане на бележка, където ще се покаже резултатът, тъй като файл със същото име може да бъде в няколко папки.

Като натиснете бутона, напишете следния код:

процедура ScanFolder (Папка: String);

процедура TForm1.ScanFolder (Папка: String); вар

sr: TSearchRec; FileName: String;

ако FindFirst (Folder + '\ *. *', faAnyFile, sr) = 0, тогава започнете да повтаряте

ако (sr.Name = 1. 1) или (sr.Name = '.') след това продължете;

FileName: = SlashSep (Папка, sr.Name);

if (sr.Attr и faDirectory) = faDirectory след това започнете

i f AnsiUpperCase (edLookFor; Text) = AnsiUpperCase (sr.Name), след това Memol.Lines.Add (FileName);

FindClose (sr); край; край;

На първия ред започнете търсенето с помощта на функцията FindFirst. Първият параметър е папката плюс маската Vs. * '. Вторият параметър е faAnyFile, така че функцията търси всички файлове от всякакъв тип за нас. Последно па­параметърът е TSearchRec структура, чрез която ще получим резултата. Ако файлът бъде намерен, тогава проверяваме дали името е равно на точка или две точки, след това около­продължете да търсите по-нататък.

След това поставяме пълния път на намерения файл в променливата FileName. За това използваме функцията SlashSep. Тази функция не съществува в Delphi, трябва да я напишем сами:

функция SlashSep (Path, FName: низ): низ;

ако Път [Дължина (Път)] <> '\' тогава резултат: = Път + '\' + FName друго Резултат: = Път + FName;

Функцията получава пътя и името на файла като параметри. Въпросът е, че ако пътят не завършва с наклонена черта, той трябва да бъде добавен. Тук се прави точно това.

Да се ​​върнем към Листинг 10.18. На следващия етап проверяваме какво точно намерихме - файл или папка. Ако това е папка, тогава трябва да потърсите файла вътре в нея. За целта извикваме ScanFolder с подпапка. Но ние вече намерихме­Разглеждаме тази функция, оказва се, че функцията ще се извика? Пра­точно - това е рекурсия. Обаждаме се отново на ScanFolder с vlo­папка и това обаждане ще продължи, докато всички папки бъдат сканирани.

Ако не открием папка, проверяваме името на файла. Ако е същото като е­my, след това показваме съответното съобщение в компонента Memo. Така че, търсете­продължава, докато не прегледаме всички файлове.

Този пример е добър, но не е ефективен. Факт е, че ще прегледаме абсолютно всички файлове във всяка папка, което не е ефективно. Ще бъде много по-бързо да търсите конкретен файл веднага. За да направите това, променете първия ред, както следва:

Сега, като първи параметър, ние посочваме не просто път с маска, а конкретен файл и резултатът ще бъде положителен само ако необходимият файл е в желаната папка.

Можете също така да посочите маски като низ за търсене, например следният ред търси всички INI файлове в корена на C устройството:

Но когато посочите конкретен файл, функцията няма да връща бащи­Ки. Как да решим този проблем? Опитайте се да мислите за себе си. Имайте достатъчно ейл­решение на Гант.