Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект лекций_2 семестр.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.4 Mб
Скачать

Класс tStringStream

Так как строковые константы и переменные широко применяются при разработке приложений, то для удобства работы с ними создан специальный класс TStringStream. Он обеспечивает хранение строки и доступ к ней во время выполнения приложения.

Он обладает стандартным для потоков набором свойств и методов, добавляя к ним еще несколько, упрощающих использование строк.

Свойство только для чтения

property DataString: string; обеспечивает доступ к хранимой строке.

Методы function Read(var Buffer; Count: Longint): Longint; override; и

function Write(const Buffer; Count: Longint): Longint; override; реализуют обычный для потоков способ чтения и записи строки для произвольной переменной Buffer.

Метод function ReadString(Count: Longint): string; обеспечивает чтение count байтов строки потока, начиная с текущей позиции.

Метод procedure WriteString(const AString: string); дописывает к строке строку AString, начиная с текущей позиции.

При работе с файлами и потоками используются дополнительные классы исключительных ситуаций. Класс EFCreateError Возникает при ошибке создания файла, a EFOpenError — при открытии файла. При чтении/записи данных в поток могут возникнуть исключительные ситуации зEReadError И EWriteError.

Оповещение об изменениях в файловой системе

Многие программисты задавались вопросом: как получить сигнал от операционной системы о том, что в файловой системе произошли какие-то изменения? Такой вид оповещения позаимствован из ОС UNIX и теперь доступен программистам, работающим с Win32.

Для организации мониторинга файловой системы нужно использовать три функции — FindFirstChangeNotification, FindNextChangeNotification и FindcioseChangeNotification. Первая из них возвращает дескриптор объекта файлового оповещения, который можно передать в функцию ожидания. Объект активизируется тогда, когда в заданной папке произошли те или иные изменения (создание или уничтожение файла или папки, изменение прав доступа и т. д.)- Вторая функция — готовит объект к реакции на следующее изменение. Наконец, с помощью третьей функции следует закрыть, ставший ненужным, объект. Так может выглядеть код метода Execute потока, созданного для мониторинга:

var DirName : string;

procedure TSimpleThread.Execute;

var r: Cardinal;

fn : THandle;

begin

fn := FindFirstChangeNotificationtpChar(DirName),True,

FILE_NOTIFY_CHANGE_FILE_NAME);

repeat

r := WaitForSingleObject(fn,2000);

if r = WAIT_OBJECT_0 then

Forml.UpdateList;

if not FindNextChangeNotification(fn) then break;

until Terminated;

FindcioseChangeNotification(fn);

end;

На главной форме должны находиться компоненты, нужные для выбора обследуемой папки, а также компонент TListBox, в который будут записываться имена файлов:

procedure TForml.ButtonlClick(Sender: TObject);

var dir : string;

begin

if SelectDirectory(dir,[],0) then

begin

Edit1.Text := dir;

DirName := dir;

end;

end;

procedure TForml.UpdateList;

var SearchRec: TSearchRec;

begin

ListBoxl.Clear;

FindFirst(Editl.Text+'\*.*', faAnyFile, SearchRec);

repeat

ListBoxl.Items.Add(SearchRec.Name);

until FindNext(SearchRec) <> 0;

FindClose(SearchRec);

end;

Приложение готово. Чтобы оно стало полнофункциональным, предусмотрите в нем механизм перезапуска потока при изменении обследуемой папки.