на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


Реферат: Разработка файловой оболочки


Реферат: Разработка файловой оболочки

Постановка задачи.

Задача заключается в разработке файловой оболочки для операционной системы 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);

Страницы: 1, 2, 3


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.