Търсете файлове в 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. Как vidite, той знае как да върне размера на намерения файл. Ето тема за пример - ще напишем код, който ще определи размера на посочения файл.
Създайте нов проект и инсталирайте два компонента 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 устройството:
Но когато посочите конкретен файл, функцията няма да връща бащиКи. Как да решим този проблем? Опитайте се да мислите за себе си. Имайте достатъчно ейлрешение на Гант.
- Търсене в TSU
- Намиране на I/O тесни места за MS SQL Server
- Полицията продължава да търси измамници, продали дарсонвал на прекомерна цена
- Търсене на продукти
- Разврат - търсене на думи по маска и определение, отговори на кръстословици