Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

End; end;



Первым делом я вызвал функцию FileExists которой указал имя интересующего меня файла. Эта функция проверила на существование файл. Если он существует, то я могу попытаться прочитать иначе это делать бесполезно. При чтении я так же читаю сразу всю структуру.

Как видишь, структуры очень удобны для хранения каких-либо структурированных данных. Конечно же, пример не очень удачный, потому что такие параметры лучше сохранять в реестре, а не в файле, но главное – это сам процесс. Я буду часто использовать структуры там, где это необходимо, потому что они действительно упрощают процесс кодинга.

На компакт диске, в директории \Примеры\Глава 10\Records ты можеш ь увидеть приме р это й программы.

10.9 Храним структуры в динамической памяти

Структуры могут быть не только локальными (храниться в стеке) но и динамическими (располагаться в динамической памяти). Почему память называется динамической? Да потому что стек создаётся автоматически при старте проги, а вот дополнительную память нужно выделять самому. Её можно добавлять и удалять в процессе работы проги, наверно поэтому её называют динамической.

Когда объявляешь структуру, то можешь указать и её динамический тип. Для этого нужно объявить ещё одну переменную и присвоить ей «^ИмяСтруктуры». Чаще всего в качестве нового имени используют то же самое имя, только в начале добавляют букву «Р» и объявление это делают прямо перед объявлением структуры:

type PWindowsSize = ^ WindowsSize; WindowsSize = record

Left, Top, Width, Height:Integer;
end;

В этом примере PWindowsSize -ссылка на структуру. Теперь, чтобы разместить нашу структуру не в стеке, а в динамической памяти мы должны использовать именно PwindowsSize:

var ws:PWindowSize;

begin ws:=New(PWindowSize); // Выделяем память ws.Left:=10; // Изменяем одно свойство Dispose(ws); // Уничтожаем память

End;

В этом примере я объявил переменную ws типа PWindowsSize. Это значит, что ws – это всего лишь указатель и в самом начале он нулевой. Теперь нам надо этому указателю выделить память размером со структуру PWindowsSize. Для этого ей надо присвоить результат работы функции New. Эта функция выделяет динамическую память под указанный в качестве параметра объект и возвращает указатель на эту память. После этого в указателе ws находиться выделенная память, подготовленная для использования в качестве структуры PWindowsSize.

Доступ к свойствам остаётся такой же, поэтому нет смысла задерживаться на этом. Но вот в глаза сразу же бросается вызов функции Dispose. Так как мы выделили динамическую память, её нужно освободить и для этого служит именно эта функция. Просто передай ей в качестве параметра указатель, и функция корректно обнулит его.

Помни, что если ты объявил переменную типа указатель на структуру (в нашем примере это PWindowsSize), то для такого указателя обязательно нужно сначала выделить память и потом освободить его. Если ты объявляешь переменную типа структура (в нашем примере это WindowsSize), а не указатель, то такая структура автоматически расположиться в стеке и ничего не надо выделять и освобождать.

10.10 Поиск файлов

В этой главе мы уже узнали о работе с файлами и узнали, что такое структуры и как с ними работать. Сейчас я хочу тебе показать, как можно организовать поиск файлов. В этом примере мы закрепим большинство навыков описанных в этой главе.

Для начала разберёмся с алгоритмом поиска файлов, а потом подробно рассмотрим каждую из необходимых функций:

// Запускаю поиск hFindFile:= FindFirst(Маска поиска, Аттрибуты, Информация); // Проверяю корректность найденного файла if hFindFile <> INVALID_HANDLE_VALUE then // Если корректно, то запускаеться цикл repeat - until.

Repeat

// Здесь вписаны операторы, которые нужно выполнять. until (FindNext(Информация) <> 0); FindClose(Информация);

FindFirst -открывает поиск. В качестве первого параметра выступает маска поиска. Если ты укажешь конкретный файл, то система найдёт его. Но это не серьёзно, лучше искать более серьёзные вещи. Например, ты можешь запустить поиск всех файлов в корне диска С. Для этого первый параметр должен быть 'C:\*.*'. Для поиска только файлов ЕХЕ, в папке Fold ты должен указать 'C:\Fold\*.exe'.

Второй параметр -атрибуты включаемых в поиск файлов. Я использую faAnyFile, чтобы искать любые файлы. Тебе доступны

faReadOnly -искать файлы с атрибутом ReadOnly (только для чтения).

faHidden -искать скрытые файлы.

faSysFile -искать системные файлы.

faArchive -искать архивные файлы.

faDirectory -искать директории.

Последний параметр -это структура, в которой нам вернётся информация о поиске, а именно имя найденного файла, размер, время создания и т.д. После вызова этой процедуры, я проверяю на корректность найденного файла. Если всё в норме, то запускается цикл Repeat - Until.

Мы уже рассматривали с тобой циклы, но я всё же решил повториться и напомнить тебе работу используемого мной цикла. Он выполняет операторы, расположенные между repeat и until, пока условие расположенное после слова until является верным. Как только условие нарушается, цикл прерывается.

Хочу предупредить, что функция поиска, может возвращать в качестве найденного имени в структуре SearchRec (параметр Name) точку или две точки. Если ты посмотришь на директорию, то таких файлов не будет. Откуда берутся эти имена? Имя файла в виде точки указывает на текущую директорию, а имя файла из двух точек указывает на директорию верхнего уровня. Если я встречаю такие имена, то я их просто отбрасываю.

Структура

Type

TSearchRec = record Time: Integer; // Время создания найденного файла Size: Integer; // Размер найденного файла Attr: Integer; // Атрибуты найденного файла Name: TFileName; // Имя найденного файла ExcludeAttr: Integer; // Исключаемые атрибуты найденного файла FindHandle: THandle; // Указатель необходимый для поиска FindData: TWin32FindData; // Структура поиска файла Winndows

End;

Функция FindNext заставляет найти следующий файл, удовлетворяющий параметрам, указанным в функции FindFirst. Этой функции нужно передать структуру SearchRec, по которой будет определено, на каком месте сейчас остановлен поиск и с этого момента он будет продолжен. Как только будет найден новый файл, функция вернёт в структуре SearchRec информацию о новом найдённом файле.

Функция FindClose закрывает поиск. В качестве единственного параметра нужно указать всё ту же структуру SearchRec.

Давай теперь напишем какой-нибудь реальный пример, который наглядно покажет работу с функциями поиска файлов. Какой бы пример тебе написать?

Давай посмотрим на структуру TSearchRec. Как видишь, она умеет возвращать размер найденного файла. Вот и тема для примера – мы напишем код, который будет определять размер указанного файла.

Создай новый проект и брось на форму два компонента TEdit и одну кнопку. Можешь ещё украсить всё это текстом. У тебя должно получиться нечто похожее на этот рисунок:

По нажатию кнопки напиши следующий текст:

Var

SearchRec:TSearchRec; begin

// Ищем файл

if FindFirst(Edit1.Text,faAnyFile,SearchRec)=0 then

// Забираем размер Edit2.Text:=IntToStr(SearchRec.Size)+ 'байт';


// Закрываем поиск





Дата публикования: 2014-11-04; Прочитано: 486 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...