![]() |
|
|
Реферат: Разработка файловой оболочкиРеферат: Разработка файловой оболочкиПостановка задачи. Задача заключается в разработке файловой оболочки для операционной системы Windows’95/98. В программе реализовать механизмы копирования, переноса, удаления, переименования файлов и директорий, поиск файлов по маске, просмотр списка файлов по маске, просмотр и редактирование файлов во внешних редакторах, присвоение и получение атрибутов файла, присвоение атрибутов группе файлов, запуск приложений со строкой параметров, создание директории, определение размера директории, получение информации о диске, настройки интерфейса программы, определение суммарного объёма дискового пространства занимаемого группой файлов, восстановление интерфейсных параметров при повторном запуске программы. Так же обеспечить управление оболочкой при помощи манипулятора типа “мышь” и клавиатуры. Метод реализации. Для реализации поставленной задачи необходимо создать интерфейс пользователя состоящий из таких компонент: А) список директорий. Б) список файлов В) список дисков Г) главное меню программы Д) панель инструментов. Для организации интерфейса пользователя будут использованы стандартные визуальные компоненты Delphi 3.0. Для реализации механизма копирования/вставки необходимо запомнить список копируемых файлов/директорий, каждый элемент списка должен содержать информацию о месте нахождения файла/директории и имени файла/директории. При копировании группы файлов или одного файла необходимо определить их место положение в иерархии каталогов, а затем заполнить список, выбирая все файлы отмеченные пользователем из списка файлов показанного в интерфейсной части программы (списке файлов). При копировании директории необходимо также определить её положение и произвести сканирование самой директории с сохранением в списке имён файлов содержащихся в копируемой директории и структуры каталогов. Для вставки директории в место копирования, необходимо воссоздать её структуру, а затем скопировать в неё файлы. Для осуществления этого процесса вышеупомянутый список разбивается на два. В первом списке (назовем его временный список директорий) должна находиться структура каталогов, а во втором (временном списке файлов) расположенные в этих каталогах файлы. Два списка необходимы для уменьшения времени затраченного на копирование, так как при наличии одного списка необходим анализ каждого элемента списка на предмет наличия поддиректорий и создание этих поддиректорий в месте копирования, а в копируемой директории в большинстве случаев количество директорий меньше чем количество файлов и времени на проверку понадобиться больше, чем при использовании двух списков. Если же использовать два списка то для воссоздания структуры каталогов необходимо лишь отсортировать временный список директорий в соответствии с иерархией каталогов, и создавать директории проходя по списку сверху вниз. Так как после сортировки, директории расположенные на верхних уровнях вложенности каталогов будут находиться в верхней части списка, а директории расположенные на нижних уровнях будут находиться в конце списка. После воссоздания структуры директории остаётся только переписать файлы. Алгоритм заполнения временных списков показан на рисунке 1 в виде блок схемы. Реализация данного алгоритма будет базирована на использовании функций FindFirst и FindNext, эти функции осуществляют просмотр содержимого указанной директории и в качестве результата возвращают имя найденного элемента, его атрибуты, время создания и размер. При анализе атрибутов найденного элемента можно определить данный элемент директория или файл, и в соответствии с анализом записать его имя и положение в соответствующий список. На описанном алгоритме будет базирован также механизм удаления директории. Упомянутые выше функции FindFirst и FindNext будут также применены при реализации механизма поиска файлов по маске. Описание программы. Программа реализована на языке паскаль с использованием Delphi 3.0 - среды визуального программирования приложений для Windows’95 . Детально рассмотрим реализацию некоторых механизмов, таких как: Поиск файлов; Копирование Директорий; Удаление директорий. Поиск файлов: Поиск файлов в программе реализован с использованием маски. В маске возможно использование служебного символа, замены группы неизвестных символов в имени файла, или его расширении “*”, а также возможен поиск с различием регистров символов, и без такового, с указанием области поиска. Так же существуют возможности поиска с наложением дополнительных ограничений, таких как размер искомого файла, а так же времени создания файла. Детально с реализацией выше перечисленных механизмов вы можете ознакомиться в приложении 1 на страницах (29-35). Здесь же, мы рассмотрим реализацию основной части этого механизма. Для поиска файлов по маске необходимо задание маски поиска в виде *.сом или autoexec.*, или другие возможные варианты, и области поиска. В качестве дополнительного параметра может быть задана проверка регистра символов. Блок схема поиска файлов показана на рисунке 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.Attr<>faDirectory) then begin // Проверка на размер найденного файла // размер и время создания найденого файла должны находится в пределах заданных // пользователем if not(((F.Size < StrToInt(FindForm.SLess.Text)) and (F.Size > StrToInt(FindForm.SGreater.Text)))) then Continue; if not(((FileDateTime(CurDir+F.Name)<FindForm.DateIsBefore.Date) and (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.Panels[0].Text)+1); FindForm.FileWasFind.Refresh; end; // выполнять поиск пока не закончатся файлы в текущей области заданной области. Until((FindNext(F) <> 0)); FindClose(F); end; В форме поиска файлов возможен переход к выбранному файлу, из списка найденных, а также запуск либо просмотр/редактирование во внешнем редакторе. Копирование / Удаление директорий: Описанная выше реализация алгоритма поиска файлов применёна в реализации копирования и удаления директорий. При реализации рассматриваемых процессов понадобится наличие двух временных списков: списка директорий и списка файлов (каждая строка обоих списков включает в себя “полный путь” (FULL PATH)) файла/директории. Для реализации временных списков использован визуальная компонента ListBoх, данная компонента представляет собой динамический список строк и набор процедур и функций для управления этим списком. Заполнение этих списков осуществляется при помощи просмотра директории. С листингом программы реализующем эти процессы вы можете ознакомиться в приложении 1 на страницах (17,23-27). Для копирования/удаления директорий составляются оба вышеупомянутых списка. При вставке директории создаётся полное дерево директории, а затем происходит копирование файлов. При удалении директории так же составляются оба списка, но так как стандартной процедуры удаляющей не пустую директорию нет, то в начале удаляются все файлы в удаляемой директории (включая файлы находящиеся в поддиректориях), а затем пустые директории. Анализ результатов. Программа имеет все необходимые функции работы с файлами. Все функции можно активизировать нажатием комбинации клавиш. Производиться статистика копирования, переноса, удаления файлов/директорий в удобной для восприятия пользователем форме. Существует простой механизм наложения фильтра на показываемые файлы. При изменении интерфейса программы, все изменения сохраняются и будут восстановлены при следующем запуске. Запуск приложений со строкой параметров с указанием типа запуска. Вывод сообщения о количестве поддиректорий в директории и о количестве файлов расположенных в ней. Определение размера директории присвоение атрибутов группе файлов простым нажатием двух клавиш. Выводы. В ходе работы была разработана программа манипулирования файлами и директориями. В программе реализованы следующие механизмы: · копирования, переноса, удаления, переименования файлов и директорий, · поиск файлов по маске, · наложение фильтра на список файлов, · просмотр и редактирование файлов во внешних редакторах, · присвоение и получение атрибутов файла, · присвоение атрибутов группе файлов, · запуск приложений со строкой параметров, · создание директории, · определение размера директории, · получение информации о диске, · настройки интерфейса программы, · определение суммарного объёма дискового пространства занимаемого группой файлов, · восстановление интерфейсных параметров при повторном запуске программы. Программа имеет удобный интерфейс и может использоваться для работы пользователями с разным уровнем знаний. Системные требования: Операционная система Windows’95 и выше, 500 килобайт дискового пространства. Главная форма программы Модуль описывающий главную форму unit UMainForm; // главная форма программы interface // подключаемые модули (стандартные) uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, ComCtrls, StdCtrls, FileCtrl, Grids, Outline, DirOutln, ToolWin, Buttons; type TMainForm = class(TForm) MainMenu1: TMainMenu; File1: TMenuItem; About1: TMenuItem; N1: TMenuItem; Exit1: TMenuItem; Options1: TMenuItem; Directory: TDirectoryOutline; FileList: TFileListBox; Drv: TDriveComboBox; StatusBar: TStatusBar; DirectoryMenu: TPopupMenu; FileMenu: TPopupMenu; Splitter: TSplitter; Cut: TMenuItem; Copy: TMenuItem; Paste: TMenuItem; Rename1: TMenuItem; Delete: TMenuItem; NewDir: TMenuItem; CopyDir: TMenuItem; RenameDir: TMenuItem; DeleteDir: TMenuItem; PasteDir: TMenuItem; TempDelete: TListBox; TempCopyMove: TListBox; Open: TMenuItem; View: TMenuItem; FileMask1: TMenuItem; CMDirList: TListBox; DFileList: TListBox; Find1: TMenuItem; Info1: TMenuItem; CMFileList: TListBox; FileAttr: TMenuItem; SizeDirectory1: TMenuItem; CutDir: TMenuItem; ToolBar1: TToolBar; DrBox: TDriveComboBox; Bevel1: TBevel; Bevel2: TBevel; SpeedButton1: TSpeedButton; SCut: TSpeedButton; Bevel3: TBevel; SCopy: TSpeedButton; SPaste: TSpeedButton; SDel: TSpeedButton; Up: TSpeedButton; Bevel4: TBevel; Cut1: TMenuItem; Copy1: TMenuItem; Paste1: TMenuItem; Rename: TMenuItem; Delete1: TMenuItem; Selectall: TMenuItem; InvertSelect: TMenuItem; procedure About1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Options1Click(Sender: TObject); procedure DrivesSectionClick(HeaderControl: THeaderControl; Section: THeaderSection); procedure DrivesMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure NewDirClick(Sender: TObject); procedure DirectoryChange(Sender: TObject); procedure CopyClick(Sender: TObject); procedure CutClick(Sender: TObject); procedure PasteClick(Sender: TObject); procedure Rename1Click(Sender: TObject); procedure DeleteDirClick(Sender: TObject); procedure DeleteClick(Sender: TObject); procedure FileMenuPopup(Sender: TObject); procedure FileMask1Click(Sender: TObject); procedure FileListDblClick(Sender: TObject); procedure SplitterMoved(Sender: TObject); procedure Find1Click(Sender: TObject); procedure Info1Click(Sender: TObject); procedure CopyDirClick(Sender: TObject); procedure RenameDirClick(Sender: TObject); procedure FileAttrClick(Sender: TObject); procedure ViewClick(Sender: TObject); procedure SizeDirectory1Click(Sender: TObject); procedure FileListMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FileListKeyPress(Sender: TObject; var Key: Char); procedure FileListKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure PasteDirClick(Sender: TObject); procedure DirectoryMenuPopup(Sender: TObject); procedure File1Click(Sender: TObject); procedure OpenClick(Sender: TObject); procedure DrBoxChange(Sender: TObject); procedure UpClick(Sender: TObject); procedure SCutClick(Sender: TObject); procedure SPasteClick(Sender: TObject); procedure SDelClick(Sender: TObject); procedure SCopyClick(Sender: TObject); procedure FileListClick(Sender: TObject); procedure CutDirClick(Sender: TObject); procedure Cut1Click(Sender: TObject); procedure Copy1Click(Sender: TObject); procedure Paste1Click(Sender: TObject); procedure Delete1Click(Sender: TObject); procedure RenameClick(Sender: TObject); procedure FormResize(Sender: TObject); procedure InvertSelectClick(Sender: TObject); procedure FileListKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure SelectallClick(Sender: TObject); private public end; var MainForm: TMainForm; Size:integer; implementation // подключаемые модули (не стандартные) uses UAboutBox,UMainForm_, UOptionsForm, UCreateDir, UProgressForm, URenameForm, UAskDeleteForm, UGetFileMask, FmxUtils, UFindForm, UInfoForm, UAttrFilesForm,UNotTrivial, UDeleteDir, URenameDirForm, URunForm, UViewForm; {$R *.DFM} procedure TMainForm.About1Click(Sender: TObject); // вывод формы "ИНФОРМАЦИЯ О ПРОГРАММЕ" begin AboutBox.Show; end; procedure TMainForm.Exit1Click(Sender: TObject); // Обработка выхода из программы begin If AskExit then begin // Подтверждение выхода If Application.MessageBox('Exit ?','Exit',MB_APPLMODAL+MB_ICONQuestion+MB_YESNO)=IDYes then Begin // запись информации о программе в файл МС.INI SaveIniMainForm; Close; end end else begin SaveIniMainForm; Close; end; end; procedure TMainForm.FormCreate(Sender: TObject); //Установка начльных параметров для компонент главной формы begin SetUpMainForm; SetUpComponents; end; procedure TMainForm.Options1Click(Sender: TObject); //Вывод формы параметров begin // Центрирование выводимой формы относительно главной формы GetFormToCenter(OptionsForm); OptionsForm.ShowModal; end; procedure TMainForm.DrivesSectionClick(HeaderControl: THeaderControl; Section: THeaderSection); // Смена текущего диска begin Directory.Drive:=Section.Text[1]; Directory.SetDirectory(Section.Text[1]+':\'); MainForm.Directory.BuildTree; end; procedure TMainForm.DrivesMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin //перерисовка списка директорий при необходимости Directory.Repaint; end; procedure TMainForm.NewDirClick(Sender: TObject); // Создание директории и вывод соответствующей формы begin CreateDirForm.Show; end; Function CountDir(Str:String):String; // Определение количества поддиректорий в текущей директории Var F:TSearchRec; C:integer; begin c:=0; findfirst(Str+'\*.*',faAnyFile,F); findnext(F); repeat if (f.Attr>=16) and (f.attr<32) and (f.Name<>'.') and (f.Name<>'..') then c:=c+1; Until(findnext(f)<>0); CountDir:=IntToStr(c); end; procedure TMainForm.DirectoryChange(Sender: TObject); //Смена текущей директории begin //Обновление списка файлов FileList.SetDirectory(Directory.Directory); //Заполнение статус-строки MainForm.StatusBar.Panels[0].Text:=CountDir(Directory.Directory)+' dir. & '+IntToStr(MainForm.FileList.Items.Count)+ ' files '; MainForm.StatusBar.Panels[1].Text:=''; //Определение активных кнопок панели управления If UpperCase(MainForm.Directory.Directory)=UpperCase(MainForm.DrBox.Drive+':\') then begin Up.Enabled:=False; SCut.Enabled:=False; SCopy.Enabled:=False; SDel.Enabled:=False; end else begin Up.Enabled:=True; SCut.Enabled:=True; SCopy.Enabled:=True; SDel.Enabled:=True; end; end; procedure TMainForm.CopyClick(Sender: TObject); // Копирование файлов begin FlagCopyFile:=True; FlagMoveFile:=False; CopyPathFileInTemp; end; procedure TMainForm.CutClick(Sender: TObject); // Вырезание файлов begin FlagMoveFile:=True; CopyPathFileInTemp; end; procedure TMainForm.PasteClick(Sender: TObject); begin ProgressForm.Show; PasteFileFromTemp; ProgressForm.Close; MainForm.TempCopyMove.Clear; end; procedure TMainForm.Rename1Click(Sender: TObject); // Переименование файлов в соответствующей экранной форме begin GetFormToCenter(RenameFileForm); RenameFileForm.ShowModal; end; procedure TMainForm.DeleteDirClick(Sender: TObject); // Удаление директории begin // Обнуление временных списков MainForm.CMDirList.Clear; MainForm.CMFileList.Clear; DeleteEmptyDirectory(MainForm.Directory.Directory); //Обновление списка директорий MainForm.Directory.Invalidate; end; procedure TMainForm.DeleteClick(Sender: TObject); //Удаление файлов begin AskDeleteForm.Show; end; procedure TMainForm.FileMenuPopup(Sender: TObject); //Определение видимых строк в контектсном меню файловой области //в момент его вызова begin if MainForm.FileList.SelCount=0 then begin with MainForm.FileMenu do begin Delete.Enabled:=False; Cut.Enabled:=False; Copy.Enabled:=False; Rename1.Enabled:=False; end; end else begin with MainForm.FileMenu do begin Delete.Enabled:=True; Cut.Enabled:=True; Copy.Enabled:=True; Rename1.Enabled:=True; end; end; if MainForm.TempCopyMove.Items.Count = 0 then Paste.Enabled:=False else Paste.Enabled:=True; end; procedure TMainForm.FileMask1Click(Sender: TObject); // Запрос маски файлов для списка файлов (в дальнейшем СФ) begin GetFileMask.Show; end; procedure TMainForm.FileListDblClick(Sender: TObject); // Запуск программ/редактирование(просмотр) во внешнем редакторе // при двойном щелчке мышкой Var str:string; begin Str:=FileList.FileName; ExecuteFile(Str,'','',SW_SHOW); end; procedure TMainForm.SplitterMoved(Sender: TObject); //Перемещение разделителя СФ и Списка директорий (В Дальнейшем СД) begin // Ограничение на положение разделителя // Ширина СД не должна быть меньше Списка дисков (В дальнейшем СПД) if Splitter.Left<=DrBox.Width then begin Directory.Width:=DrBox.Width+6; end; // Сохранение положения разделителя для следующего запуска программы McIni.WriteInteger('ASWindow','Splitter',MainForm.Directory.Width); // Установка размеров панелей статус-строки MainForm.StatusBar.Panels[0].Width:=MainForm.Directory.Width; end; procedure TMainForm.Find1Click(Sender: TObject); // Поиск файлов begin FindForm.Show end; procedure TMainForm.Info1Click(Sender: TObject); // Вывод информации о текущем диске и директории begin GetFormToCenter(InfoForm); InfoForm.ShowModal; end; procedure TMainForm.CopyDirClick(Sender: TObject); //Копирование директорий (Выбран пункт меню копировать) begin SourseDir:=MainForm.Directory.Directory; DoingWithDir:=True; CopyMoveDirectory; end; procedure TMainForm.RenameDirClick(Sender: TObject); //Переименование директории в соответствующей форме begin GetFormToCenter(RenameDirForm); RenameDirForm.ShowModal; end; procedure TMainForm.FileAttrClick(Sender: TObject); //Получение установка атрибутов файла в соотв. форме begin GetFormToCenter(AttrFileForm); AttrFileForm.ShowModal; end; procedure TMainForm.ViewClick(Sender: TObject); // Определение видимых компонент в меню VIEW // в момент его открытия begin if MainForm.FileList.SelCount = 0 then begin MainForm.FileAttr.Enabled:=False; end else begin MainForm.FileAttr.Enabled:=True; end; if UpperCase(MainForm.Directory.Directory)=UpperCase(MainForm.DrBox.Drive+':\') then MainForm.SizeDirectory1.Enabled:=False else MainForm.SizeDirectory1.Enabled:=True; end; Procedure DDD(DirS:string); // Определение размера текущей директории Var d:TSearchRec; begin FindFirst(DirS+'\'+'*.*',faAnyFile,D); FindNext(D); repeat if (D.Name<>'.') and (D.Name<>'..') then begin if (D.Attr=faDirectory) Or (D.Attr=18) then begin DDD(DirS+'\'+D.Name); |
|
|||||||||||||||||||||||||||||
![]() |
|
Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое. |
||
При использовании материалов - ссылка на сайт обязательна. |