1. Постановка задачи.
Задача заключается в разработке файловой оболочки для операционной
системы Windows’95/98. В программе реализовать механизмы копирования,
переноса, удаления, переименования файлов и директорий, поиск файлов по
маске, просмотр списка файлов по маске, просмотр и редактирование файлов во
внешних редакторах, присвоение и получение атрибутов файла, присвоение
атрибутов группе файлов, запуск приложений со строкой параметров, создание
директории, определение размера директории, получение информации о диске,
настройки интерфейса программы, определение суммарного объёма дискового
пространства занимаемого группой файлов, восстановление интерфейсных
параметров при повторном запуске программы. Так же обеспечить управление
оболочкой при помощи манипулятора типа «мышь» и клавиатуры.
2. Метод реализации.
Для реализации поставленной задачи необходимо создать интерфейс
пользователя состоящий из таких компонент:
А) список директорий.
Б) список файлов
В) список дисков
Г) главное меню программы
Д) панель инструментов.
Для организации интерфейса пользователя будут использованы
стандартные визуальные компоненты Delphi 3.0. Для реализации механизма
копирования/вставки[1] необходимо запомнить список копируемых
файлов/директорий, каждый элемент списка должен содержать информацию о
месте нахождения файла/директории и имени файла/директории. При копировании
группы файлов или одного файла необходимо определить их место положение в
иерархии каталогов, а затем заполнить список, выбирая все файлы отмеченные
пользователем из списка файлов показанного в интерфейсной части программы
(списке файлов). При копировании директории необходимо также определить её
положение и произвести сканирование самой директории с сохранением в списке
имён файлов содержащихся в копируемой директории и структуры каталогов. Для
вставки директории в место копирования, необходимо воссоздать её структуру,
а затем скопировать в неё файлы. Для осуществления этого процесса
вышеупомянутый список разбивается на два. В первом списке (назовем его
временный список директорий) должна находиться структура каталогов, а во
втором (временном списке файлов) расположенные в этих каталогах файлы. Два
списка необходимы для уменьшения времени затраченного на копирование, так
как при наличии одного списка необходим анализ каждого элемента списка на
предмет наличия поддиректорий и создание этих поддиректорий в месте
копирования, а в копируемой директории в большинстве случаев количество
директорий меньше чем количество файлов и времени на проверку понадобиться
больше, чем при использовании двух списков.
Если же использовать два списка то для воссоздания структуры каталогов
необходимо лишь отсортировать временный список директорий в соответствии с
иерархией каталогов, и создавать директории проходя по списку сверху вниз.
Так как после сортировки, директории расположенные на верхних уровнях
вложенности каталогов будут находиться в верхней части списка, а директории
расположенные на нижних уровнях будут находиться в конце списка. После
воссоздания структуры директории остаётся только переписать файлы.
Алгоритм заполнения временных списков показан на рисунке 1 в виде блок
схемы. Реализация данного алгоритма будет базирована на использовании
функций FindFirst и FindNext, эти функции осуществляют просмотр содержимого
указанной директории и в качестве результата возвращают имя найденного
элемента, его атрибуты, время создания и размер. При анализе атрибутов
найденного элемента можно определить данный элемент директория или файл, и
в соответствии с анализом записать его имя и положение в соответствующий
список. На описанном алгоритме будет базирован также механизм удаления
директории.
Упомянутые выше функции FindFirst и FindNext будут также применены при
реализации механизма поиска файлов по маске.
3. Описание программы.
Программа реализована на языке паскаль с использованием
Delphi 3.0 - среды визуального программирования приложений для Windows’95 .
Детально рассмотрим реализацию некоторых механизмов, таких как:
. Поиск файлов;
. Копирование Директорий;
. Удаление директорий.
Поиск файлов:
Поиск файлов в программе реализован с использованием маски. В маске
возможно использование служебного символа, замены группы неизвестных
символов в имени файла, или его расширении «*», а также возможен поиск с
различием регистров символов, и без такового, с указанием области поиска.
Так же существуют возможности поиска с наложением дополнительных
ограничений, таких как размер искомого файла, а так же времени создания
файла. Детально с реализацией выше перечисленных механизмов вы можете
ознакомиться в приложении 1 на страницах (29-35). Здесь же, мы рассмотрим
реализацию основной части этого механизма.
Для поиска файлов по маске необходимо задание маски поиска в виде
*.сом или autoexec.*, или другие возможные варианты, и области поиска[2]. В
качестве дополнительного параметра может быть задана проверка регистра
символов. Блок схема поиска файлов показана на рисунке 1. При поиске
используется рекурсивная процедура (текст 1.) в которой последовательно
просматривается область поиска, включая
Текст 1.
Procedure TFindForm.FindInCurrentDir(CurDir:string);
Var
SizeF:integer; i:integer;
EndList:boolean;
F:TSearchRec;
D:string; begin
{Вывод в статус строке директории в которой производится
поиск}
FindForm.StatusFind.Panels[1].Text:=CurDir;
FindFirst(CurDir+'*.*',faAnyFile,F);
FindNext(F); repeat
// Проверка расширенного поиска
If FindForm.CBAdvSearch.Checked and
(F.AttrfaDirectory) then begin
// Проверка на размер найденного файла
// размер и время создания найденого файла должны находится в пределах заданных
// пользователем if not(((F.Size
(F.Size > StrToInt(FindForm.SGreater.Text)))) then
Continue; if not(((FileDateTime(CurDir+F.Name)
FindForm.DateIsAfter.Date))) then Continue; end;
// проверить не является ли найденый файл директорией if F.Attr=faDirectory then if (F.Name'.') and (F.Name'..') then begin
// если найденный файл – директория ,
рекурсивный вызов поиска в данной директории
FindInCurrentDir(CurDir+F.Name+''); end; if (F.Name'..') and (F.Name'.') then
// если файл подходит под маску, занести его в список if CompareFileWithMask(F.Name) then begin
FindForm.FileWasFind.Items.Add(CurDir+F.Name);
FindForm.StatusFind.Panels[0].Text:=IntToStr(StrToInt(FindForm.StatusFind.Pa
nels[0].Text)+1);
FindForm.FileWasFind.Refresh; end;
// выполнять поиск пока не закончатся файлы в текущей области заданной
области.
Until((FindNext(F) 0));
FindClose(F); end;
подкаталоги, сравнивается имя найденного файл с маской поиска, и если все
наложенные ограничения выполнены, найденный файл заносится в список
предлагаемый пользователю для просмотра. Для организации поиска в разных
областях изменяется лишь место первого вызова рекурсивной процедуры.
В форме поиска файлов возможен переход к выбранному файлу, из списка
найденных, а также запуск либо просмотр/редактирование во внешнем
редакторе.
Копирование / Удаление директорий:
Описанная выше реализация алгоритма поиска файлов применёна в
реализации копирования и удаления директорий[3]. При реализации
рассматриваемых процессов понадобится наличие двух временных списков:
списка директорий и списка файлов (каждая строка обоих списков включает в
себя «полный путь» (FULL PATH)) файла/директории. Для реализации временных
списков использован визуальная компонента ListBoх, данная компонента
представляет собой динамический список строк и набор процедур и функций для
управления этим списком. Заполнение этих списков осуществляется при помощи
просмотра директории. С листингом программы реализующем эти процессы вы
можете ознакомиться в приложении 1 на страницах (17,23-27). Для
копирования/удаления директорий составляются оба вышеупомянутых списка. При
вставке директории создаётся полное дерево директории, а затем происходит
копирование файлов[4]. При удалении директории так же составляются оба
списка, но так как стандартной процедуры удаляющей не пустую директорию
нет, то в начале удаляются все файлы в удаляемой директории (включая файлы
находящиеся в поддиректориях), а затем пустые директории.
4. Анализ результатов.
Программа имеет все необходимые функции работы с файлами. Все функции
можно активизировать нажатием комбинации клавиш. Производиться статистика
копирования, переноса, удаления файлов/директорий в удобной для восприятия
пользователем форме. Существует простой механизм наложения фильтра на
показываемые файлы. При изменении интерфейса программы, все изменения
сохраняются и будут восстановлены при следующем запуске. Запуск приложений
со строкой параметров с указанием типа запуска. Вывод сообщения о
количестве поддиректорий в директории и о количестве файлов расположенных в
ней. Определение размера директории присвоение атрибутов группе файлов
простым нажатием двух клавиш.
5. Выводы.
В ходе работы была разработана программа манипулирования файлами и
директориями.
В программе реализованы следующие механизмы:
копирования, переноса, удаления, переименования файлов и директорий,
поиск файлов по маске,
наложение фильтра на список файлов,
просмотр и редактирование файлов во внешних редакторах,
присвоение и получение атрибутов файла,
присвоение атрибутов группе файлов,
запуск приложений со строкой параметров,
создание директории,
определение размера директории,
получение информации о диске,
настройки интерфейса программы,
определение суммарного объёма дискового пространства занимаемого группой
файлов,
восстановление интерфейсных параметров при повторном запуске программы.
Программа имеет удобный интерфейс и может использоваться для работы
пользователями с разным уровнем знаний.
Системные требования: Операционная система Windows’95 и выше, 500 килобайт
дискового пространства.
6. Литература.
П. Туротт, Г. Брент, Р. Багдазиан, С.Тендон «DELPHI 3», DiaSoft, Киев,
1997 г.
-----------------------
[1] Механизм копирования разбит на две части копирование/вставка исходя из
предпологаемого интерфейса программы
2 Возможны 3 области поиска: поиск в текущей директории; поиск на текущем
диске; поиск на всех жестких дисках (также сетевых).
3 Перенос директорий не рассматривается ввиду того, что его алгоритм
является последовательной
комбинацией алгоритма копирования и алгоритма удаления.
4 Если объём копируемых файлов превышает объём пустого места в месте
назначения, копирование произведено не будет