Мои Конспекты
Главная | Обратная связь

...

Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

Protected





Помощь в ✍️ написании работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

{ Find function returns -1 if not found }

function FindFileIndex(FileName: string): integer;

function NoLockGetFileList: TStringList;

function NoLockGetChecksum(FileName: string): integer;

Public

constructor Create;

destructor Destroy; override;

procedure SetChecksum(FileName: string; Checksum: integer);

procedure RemoveChecksum(FileName: string);

function GetChecksum(FileName: string): integer;

function GetFileList: TStringList;

function GetChecksumList: TStringList;

end;

 

Implementation

Type

TCheckSum = record

FileName: string;

Checksum: integer;

end;

 

PCheckSum = ^TCheckSum;

constructor TChecksumList.Create;

Begin

inherited Create;

FCheckList := TList.Create;

FSync := TSimpleSynchronizer.Create;

end;

destructor TCheckSumList.Destroy;

Var

iter: integer;

CurSum: PCheckSum;

Begin

if FCheckList.Count > 0 then

Begin

for iter := 0 to FCheckList.Count - 1 do

Begin

CurSum := PCheckSum(FCheckList.Items[iter]);

if Assigned(CurSum) then Dispose(CurSum);

end;

end;

FCheckList.Free;

FSync.Free;

inherited Destroy;

end;

 

function TCheckSumList.FindFileIndex(FileName: string): integer;

Var

iter: integer;

CurSum: PCheckSum;

Begin

result := -1;

if FCheckList.Count > 0 then

Begin

for iter := 0 to FCheckList.Count - 1 do

Begin

CurSum := PCheckSum(FCheckList.Items[iter]);

Assert(Assigned(CurSum));

if AnsiCompareText(FileName, CurSum.FileName) = 0 then

Begin

result := iter;

exit;

end;

end;

end;

end;

 

procedure TCheckSumList.SetChecksum(FileName: string; Checksum: integer);

Var

CurSum: PCheckSum;

CurIndex: integer;

Begin

FSync.StartWrite;

CurIndex := FindFileIndex(FileName);

if CurIndex >= 0 then

CurSum := PCheckSum(FCheckList.Items[CurIndex])

Else

Begin

New(CurSum);

FCheckList.Add(CurSum);

end;

CurSum.FileName := FileName;

CurSum.Checksum := Checksum;

FSync.EndWrite;

end;

 

procedure TCheckSumList.RemoveChecksum(FileName: string);

Var

CurIndex: integer;

Begin

FSync.StartWrite;

CurIndex := FindFileIndex(FileName);

if CurIndex >= 0 then

Begin

FCheckList.Delete(CurIndex);

FCheckList.Pack;

end;

FSync.EndWrite;

end;

 

function TCheckSumList.NoLockGetChecksum(FileName: string): integer;

Var

CurIndex: integer;

CurSum: PCheckSum;

Begin

result := 0;

CurIndex := FindFileIndex(FileName);

if CurIndex >= 0 then

Begin

CurSum := PCheckSum(FCheckList.Items[CurIndex]);

Assert(Assigned(CurSum));

result := CurSum.Checksum;

end;

end;

 

function TCheckSumList.GetChecksum(FileName: string): integer;

Begin

FSync.StartRead;

result := NoLockGetChecksum(FileName);

FSync.EndRead;

end;

 

function TCheckSumList.NoLockGetFileList: TStringList;

Var

iter: integer;

CurSum: PCheckSum;

Begin

result := TStringList.Create;

if FCheckList.Count > 0 then

Begin

for iter := 0 to FCheckList.Count - 1 do

Begin

CurSum := PCheckSum(FCheckList.Items[iter]);

Assert(Assigned(CurSum));

result.Add(CurSum.FileName);

end;

end;

result.Sort;

end;

 

function TCheckSumList.GetFileList: TStringList;

Begin

FSync.StartRead;

result := NoLockGetFileList;

FSync.EndRead;

end;

 

function TCheckSumList.GetChecksumList: TStringList;

Var

iter: integer;

Begin

FSync.StartRead;

result := NoLockGetFileList;

if result.Count > 0 then

Begin

for iter := 0 to result.Count - 1 do

Begin

result.strings[iter] := result.strings[iter]

+ ' ' + IntToStr(NoLockGetChecksum(result.strings[iter]));

end;

end;

FSync.EndRead;

end;

 

end.

Основные операции:

· Установить контрольную сумму определенного файла. При этом в список добавляется элемент, соответствующий файлу, если его еще не было.

· Получить контрольную сумму определенного файла. Результат будет 0, если файл не найден.

· Удалить файл из списка.

· Получить список строк со всеми именами файлов.

· Получить список строк со всеми именами файлов и соответствующими контрольными суммами.

Для всех этих публично доступных операций в начале и конце их производятся соответствующие вызовы синхронизации.

Заметьте, что есть методы, название которых начинается с "NoLock". Это методы, которые нужно вызывать из нескольких опубликованных методов. Класс написан таким образом из-за ограничений нашего синхронизатора: вложенные вызовы начала чтения или записи недопустимы. Все действия, которые используют простой синхронизатор, должны вызывать только StartRead или StartWrite, если они уже закончили все предыдущие операции чтения или записи. Более подробно это будет обсуждаться позже. За этим исключением, большая часть кода списка контрольных сумм довольно стандартна, представляет собой в основном обычную обработку списка, и не должна составить никаких трудностей для большинства Delphi-программистов.

Теперь рассмотрим код рабочего потока

unit CheckThread;

{ Martin Harvey 30/5/2000 }

Доверь свою работу ✍️ кандидату наук!
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой



Поиск по сайту:







©2015-2020 mykonspekts.ru Все права принадлежат авторам размещенных материалов.