Смекни!
smekni.com

Файловая оболочка (Delphi 30 )

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


Задачазаключаетсяв разработкефайловой оболочкидля операционнойсистемы Windows’95/98.В программе реализоватьмеханизмыкопирования,переноса, удаления,переименованияфайлов и директорий,поиск файловпо маске, просмотрсписка файловпо маске, просмотри редактированиефайлов во внешнихредакторах,присвоениеи получениеатрибутовфайла, присвоениеатрибутовгруппе файлов,запуск приложенийсо строкойпараметров,создание директории,определениеразмера директории,получениеинформациио диске, настройкиинтерфейсапрограммы,определениесуммарногообъёма дисковогопространствазанимаемогогруппой файлов,восстановлениеинтерфейсныхпараметровпри повторномзапуске программы. Так же обеспечитьуправлениеоболочкой припомощи манипуляторатипа «мышь»и клавиатуры.


  1. Методреализации.


Дляреализациипоставленнойзадачи необходимосоздать интерфейспользователясостоящий изтаких компонент:

А) списокдиректорий.

Б) списокфайлов

В) списокдисков

Г) главноеменю программы

Д) панельинструментов.

Дляорганизацииинтерфейсапользователябудут использованыстандартныевизуальныекомпонентыDelphi3.0.Для реализациимеханизмакопирования/вставки1необходимозапомнитьсписок копируемыхфайлов/директорий,каждый элементсписка долженсодержатьинформациюо месте нахожденияфайла/директориии имени файла/директории.При копированиигруппы файловили одногофайла необходимоопределитьих место положениев иерархиикаталогов, азатем заполнитьсписок, выбираявсе файлы отмеченныепользователемиз списка файловпоказанногов интерфейснойчасти программы(списке файлов).При копированиидиректориинеобходимотакже определитьеё положениеи произвестисканированиесамой директориис сохранениемв списке имёнфайлов содержащихсяв копируемойдиректориии структурыкаталогов. Длявставки директориив место копирования,необходимовоссоздатьеё структуру,а затем скопироватьв неё файлы.Для осуществленияэтого процессавышеупомянутыйсписок разбиваетсяна два. В первомсписке (назовемего временныйсписок директорий)должна находитьсяструктуракаталогов, аво втором (временномсписке файлов)расположенныев этих каталогахфайлы. Два списканеобходимыдля уменьшениявремени затраченногона копирование,так как приналичии одногосписка необходиманализ каждогоэлемента спискана предметналичия поддиректорийи создание этихподдиректорийв месте копирования,а в копируемойдиректориив большинствеслучаев количестводиректорийменьше чемколичествофайлов и временина проверкупонадобитьсябольше, чем прииспользованиидвух списков.

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

Алгоритмзаполнениявременныхсписков показанна рисунке 1 ввиде блок схемы.Реализацияданного алгоритмабудет базированана использованиифункций FindFirstиFindNext,эти функцииосуществляютпросмотр содержимогоуказаннойдиректориии в качестверезультатавозвращаютимя найденногоэлемента, егоатрибуты, времясоздания иразмер. Прианализе атрибутовнайденногоэлемента можноопределитьданный элементдиректорияили файл, и всоответствиис анализомзаписать егоимя и положениев соответствующийсписок. На описанномалгоритме будетбазирован такжемеханизм удалениядиректории.

Упомянутыевыше функцииFindFirstиFindNext будуттакже примененыпри реализациимеханизмапоиска файловпо маске.


  1. Описаниепрограммы.

Программареализованана языке паскальс использованием

Delphi3.0 - средывизуальногопрограммированияприложенийдля Windows’95.


Детальнорассмотримреализациюнекоторыхмеханизмов,таких как:

  • Поискфайлов;

  • КопированиеДиректорий;

  • Удалениедиректорий.


Поискфайлов:

Поискфайлов в программереализованс использованиеммаски. В маскевозможноиспользованиеслужебного символа, заменыгруппы неизвестныхсимволов вимени файла,или его расширении«*», а также возможенпоиск с различиемрегистровсимволов, и безтакового, суказаниемобласти поиска.Так же существуютвозможностипоиска с наложениемдополнительныхограничений,таких как размерискомого файла,а так же временисоздания файла.Детально среализациейвыше перечисленныхмеханизмоввы можетеознакомитьсяв приложении1 на страницах(29-35). Здесь же, мырассмотримреализациюосновной частиэтого механизма.

Дляпоиска файловпо маске необходимозадание маскипоиска в виде*.сом илиautoexec.*,или другиевозможныеварианты, иобласти поиска2.В качестведополнительногопараметра можетбыть заданапроверка регистрасимволов. Блоксхема поискафайлов показанана рисунке 1.При поискеиспользуетсярекурсивнаяпроцедура(текст 1.) в которойпоследовательнопросматриваетсяобласть поиска,включая


Текст 1.

ProcedureTFindForm.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

// Проверкарасширенногопоиска

IfFindForm.CBAdvSearch.Checked and (F.AttrfaDirectory) then

begin

// Проверкана размер найденногофайла

//размер и времясоздания найденогофайла должнынаходится впределах заданных

//пользователем

if not(((F.Size

(F.Size >StrToInt(FindForm.SGreater.Text)))) then Continue;

ifnot(((FileDateTime(CurDir+F.Name) FindForm.DateIsAfter.Date))) thenContinue;

end;

// проверитьне являетсяли найденыйфайл директорией

ifF.Attr=faDirectory then

if(F.Name'.') and (F.Name'..') then

begin

//если найденныйфайл – директория, рекурсивныйвызов поискав данной директории

FindInCurrentDir(CurDir+F.Name+'\');

end;

if(F.Name'..') and (F.Name'.') then

// еслифайл подходитпод маску, занестиего в список

ifCompareFileWithMask(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;


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

В формепоиска файловвозможен переходк выбранномуфайлу, из списканайденных, атакже запусклибо просмотр/редактированиево внешнемредакторе.


Копирование/ Удалениедиректорий:

Описаннаявыше реализацияалгоритмапоиска файловприменёна вреализациикопированияи удалениядиректорий3.При реализациирассматриваемыхпроцессовпонадобитсяналичие двухвременныхсписков: спискадиректорийи списка файлов(каждая строкаобоих списковвключает в себя«полный путь»(FULL PATH)) файла/директории.Для реализациивременныхсписков использованвизуальнаякомпонентаListBoх, данная компонентапредставляетсобой динамическийсписок строки набор процедури функций дляуправленияэтим списком.Заполнениеэтих списковосуществляетсяпри помощипросмотрадиректории. С листингомпрограммыреализующемэти процессывы можетеознакомитьсяв приложении1 на страницах(17,23-27). Для копирования/удалениядиректорийсоставляютсяоба вышеупомянутыхсписка. Привставке директориисоздаётсяполное дереводиректории,а затем происходиткопированиефайлов4.При удалениидиректориитак же составляютсяоба списка, нотак как стандартнойпроцедурыудаляющей непустую директориюнет, то в началеудаляются всефайлы в удаляемойдиректории(включая файлынаходящиесяв поддиректориях),а затем пустыедиректории.


  1. Анализрезультатов.

Программаимеет все необходимыефункции работыс файлами. Всефункции можноактивизироватьнажатием комбинацииклавиш. Производитьсястатистикакопирования,переноса, удаленияфайлов/директорийв удобной длявосприятияпользователемформе. Существуетпростой механизмналоженияфильтра напоказываемыефайлы. При измененииинтерфейсапрограммы, всеизменениясохраняютсяи будут восстановленыпри следующемзапуске. Запускприложенийсо строкойпараметровс указаниемтипа запуска.Вывод сообщенияо количествеподдиректорийв директориии о количествефайлов расположенныхв ней. Определениеразмера директории присвоениеатрибутовгруппе файловпростым нажатиемдвух клавиш.


  1. Выводы.

В ходеработы быларазработанапрограммаманипулированияфайлами идиректориями.

В программереализованыследующиемеханизмы:

  • копирования,переноса, удаления,переименованияфайлов и директорий,

  • поискфайлов по маске,

  • наложениефильтра насписок файлов,

  • просмотри редактированиефайлов во внешнихредакторах,

  • присвоениеи получениеатрибутовфайла,

  • присвоениеатрибутовгруппе файлов,

  • запускприложенийсо строкойпараметров,

  • созданиедиректории,

  • определениеразмера директории,

  • получениеинформациио диске,

  • настройкиинтерфейсапрограммы,

  • определениесуммарногообъёма дисковогопространствазанимаемогогруппой файлов,

  • восстановлениеинтерфейсныхпараметровпри повторномзапуске программы.

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

Системныетребования:Операционнаясистема Windows’95и выше, 500 килобайтдисковогопространства.


  1. Литература.

  1. П.Туротт, Г. Брент,Р. Багдазиан,С.Тендон «DELPHI3», DiaSoft, Киев, 1997 г.


1Механизм копированияразбит на двечасти копирование/вставкаисходя изпредпологаемогоинтерфейсапрограммы

22Возможны 3 областипоиска: поискв текущейдиректории;поиск на текущемдиске; поискна всех жесткихдисках (такжесетевых).

33Перенос директорийне рассматриваетсяввиду того,что его алгоритмявляетсяпоследовательной

комбинациейалгоритмакопированияи алгоритмаудаления.

44Если объёмкопируемыхфайлов превышаетобъём пустогоместа в местеназначения,копированиепроизведеноне будет


- 40-


Главная форма программы




Модульописывающийглавную форму


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);

procedureDrivesSectionClick(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);

procedureSizeDirectory1Click(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);

procedureDirectoryMenuPopup(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

// Подтверждениевыхода

IfApplication.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;


procedureTMainForm.Options1Click(Sender: TObject);

//Выводформы параметров

begin

// Центрированиевыводимой формыотносительноглавной формы

GetFormToCenter(OptionsForm);

OptionsForm.ShowModal;

end;


procedureTMainForm.DrivesSectionClick(HeaderControl: THeaderControl;

Section: THeaderSection);

// Сменатекущего диска

begin

Directory.Drive:=Section.Text[1];

Directory.SetDirectory(Section.Text[1]+':\');

MainForm.Directory.BuildTree;

end;


procedureTMainForm.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'.') and (f.Name'..')then

c:=c+1;

Until(findnext(f)0);

CountDir:=IntToStr(c);

end;


procedureTMainForm.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:='';

//Определениеактивных кнопокпанели управления

IfUpperCase(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;


procedureTMainForm.Rename1Click(Sender: TObject);

// Переименованиефайлов в соответствующейэкранной форме

begin

GetFormToCenter(RenameFileForm);

RenameFileForm.ShowModal;

end;


procedureTMainForm.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;


procedureTMainForm.FileMenuPopup(Sender: TObject);

//Определениевидимых строкв контектсномменю файловойобласти

//в моментего вызова

begin

if MainForm.FileList.SelCount=0then

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;

ifMainForm.TempCopyMove.Items.Count = 0 then

Paste.Enabled:=False

else

Paste.Enabled:=True;

end;


procedureTMainForm.FileMask1Click(Sender: TObject);

// Запросмаски файловдля спискафайлов (в дальнейшемСФ)

begin

GetFileMask.Show;

end;


procedureTMainForm.FileListDblClick(Sender: TObject);

// Запускпрограмм/редактирование(просмотр)во внешнемредакторе

// при двойномщелчке мышкой

Var

str:string;

begin

Str:=FileList.FileName;

ExecuteFile(Str,'','',SW_SHOW);

end;


procedureTMainForm.SplitterMoved(Sender: TObject);

//ПеремещениеразделителяСФ и Спискадиректорий(В ДальнейшемСД)

begin

// Ограничениена положениеразделителя

// ШиринаСД не должнабыть меньшеСписка дисков(В дальнейшемСПД)

if Splitter.Left

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;


procedureTMainForm.CopyDirClick(Sender: TObject);

//Копированиедиректорий(Выбран пунктменю копировать)

begin

SourseDir:=MainForm.Directory.Directory;

DoingWithDir:=True;

CopyMoveDirectory;

end;


procedureTMainForm.RenameDirClick(Sender: TObject);

//Переименованиедиректориив соответствующейформе

begin

GetFormToCenter(RenameDirForm);

RenameDirForm.ShowModal;

end;


procedureTMainForm.FileAttrClick(Sender: TObject);

//Получениеустановкаатрибутов файлав соотв. форме

begin

GetFormToCenter(AttrFileForm);

AttrFileForm.ShowModal;

end;


procedure TMainForm.ViewClick(Sender:TObject);

// Определениевидимых компонентв меню VIEW

// в моментего открытия

begin

if MainForm.FileList.SelCount = 0then

begin

MainForm.FileAttr.Enabled:=False;

end

else

begin

MainForm.FileAttr.Enabled:=True;

end;

ifUpperCase(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);

end

else

begin

Size:=Size+D.Size;

end;

end;

Until(FindNext(D) 0);

FindClose(D);

end;


procedureTMainForm.SizeDirectory1Click(Sender: TObject);

// Выводинформациио текущей директориив статус-строке

begin

Size:=0;

MainForm.StatusBar.Panels[0].Text:='Wait...';

DDD(MainForm.Directory.Directory);

MainForm.StatusBar.Panels[0].Text:=FormatSize(IntToStr(Size)); //перевод числав читабельныйформат

MainForm.StatusBar.Panels[0].Text:=MainForm.StatusBar.Panels[0].Text+'b';

end;


procedureTMainForm.FileListMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

// Леваякнопка мышкиотпущена

Var

i:integer;

F:TSearchRec;

str:string;

begin

str:=' ';

Size:=0;

//Еслипри помощимышки выделенагруппа файловопределитьих суммарныйразмер

for i:=0 toMainForm.FileList.Items.Count-1 do

begin

ifMainForm.FileList.Selected[i] then

begin

FindFirst(MainForm.FileList.Items[i],faAnyFile,F);

Size:=Size+F.Size;

ifMainForm.FileList.SelCount=1 then break;

end;

end;

// Еслиодин выделенныйфайл, вывестиинформациюо нем в строкестатуса

ifMainForm.FileList.SelCount=1 then

begin

MainForm.StatusBar.Panels[1].Text:=ExtractFileName(F.Name)+' '+

FormatSize(IntToStr(F.Size))+' b'+' '+

DateToStr(FileDateTime(F.Name))+' '+TimeToStr(FileDateTime(F.Name));

end

else

begin

MainForm.StatusBar.Panels[1].Text:=FormatSize(intToStr(Size))+' b'+

' in'+IntToStr(MainForm.FileList.SelCount)+ ' selected files';

end;

end;

Procedure ReselectAllFile;

// Инвертированиевыделенияфайлов

Var i:integer;

begin

For i:=0 toMainForm.FileList.Items.Count-1 do

MainForm.FileList.Selected[i]:=not MainForm.FileList.Selected[i];

end;


Procedure SelectAllF(Key:Char);

// Выделитьвсе файлы в СФ

Var

i:integer;

F:TsearchRec;

Str:string;

begin

if Key='*' then

begin

ifMainForm.FileList.SelCount=MainForm.FileList.Items.Count then

ReselectAllFile

else

begin

for i:=0 toMainForm.FileList.Items.Count-1 do

MainForm.FileList.Selected[i]:=True;

str:=' ';

Size:=0;

// ОбновлениеСтатус-строки

for i:=0 toMainForm.FileList.Items.Count-1 do

begin

ifMainForm.FileList.Selected[i] then

begin

FindFirst(MainForm.FileList.Items[i],faAnyFile,F);

Size:=Size+F.Size;

ifMainForm.FileList.SelCount=1 then break;

end;

end;

ifMainForm.FileList.SelCount=1 then

begin

MainForm.StatusBar.Panels[1].Text:=ExtractFileName(F.Name)+' '+

FormatSize(IntToStr(F.Size))+' b'+' '+

DateToStr(FileDateTime(F.Name))+' '+TimeToStr(FileDateTime(F.Name));

end

else

begin

MainForm.StatusBar.Panels[1].Text:=FormatSize(intToStr(Size))+' b'+

' in'+IntToStr(MainForm.FileList.SelCount)+ ' selected files';

end;

end;

end;

end;


procedureTMainForm.FileListKeyPress(Sender: TObject; var Key: Char);

begin

SelectAllF(Key);

end;


procedureTMainForm.FileListKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

//Нажатаклавиша наклавиатуре

Var

i:integer;

F:TSearchRec;

str:string;

begin

// еслинажат ENTER запуститьфайл

if (Key=13) and notAskDeleteForm.Active thenExecuteFile(FileList.FileName,'','',SW_SHOW);

str:=' ';

Size:=0;

for i:=0 toMainForm.FileList.Items.Count-1 do

begin

ifMainForm.FileList.Selected[i] then

begin

FindFirst(MainForm.FileList.Items[i],faAnyFile,F);

Size:=Size+F.Size;

ifMainForm.FileList.SelCount=1 then break;

end;

end;

// Обновлениестатус строки

ifMainForm.FileList.SelCount=1 then

begin

MainForm.StatusBar.Panels[1].Text:=ExtractFileName(F.Name)+' '+

FormatSize(IntToStr(F.Size))+' b'+' '+

DateToStr(FileDateTime(F.Name))+' '+TimeToStr(FileDateTime(F.Name));

end

else

begin

MainForm.StatusBar.Panels[1].Text:=FormatSize(intToStr(Size))+' b'+

' in'+IntToStr(MainForm.FileList.SelCount)+ ' selected files';

end;

end;


procedureTMainForm.PasteDirClick(Sender: TObject);

//Вставкадиректории

begin

DestinationDir:=MainForm.Directory.Directory;

PasteDirectory(SourseDir,MainForm.Directory.Directory);

MainForm.Directory.BuildTree;

//Еслидиректорияпереноситьсято удалитьисточник

If not DoingWithDir then

begin

DelNotEmptyDirectory(SourseDir);

MainForm.Directory.BuildTree;

end;

MainForm.CMDirList.Clear;

end;


procedureTMainForm.DirectoryMenuPopup(Sender: TObject);

// Определениевидимых компонентконтектсногоменю СД

begin

ifMainForm.CMDirList.Items.Count=0 then

PasteDir.Enabled:=False

else

PasteDir.Enabled:=True;

IfLength(MainForm.Directory.Directory)

begin

CopyDir.Enabled:=False;

CutDir.Enabled:=False;

DeleteDir.Enabled:=False;

RenameDir.Enabled:=False;

end

else

begin

CutDir.Enabled:=True;

CopyDir.Enabled:=True;

DeleteDir.Enabled:=True;

RenameDir.Enabled:=True;

end;

end;


procedure TMainForm.File1Click(Sender:TObject);

//Определениеявляется ливыделенныйфайл приложениеми подсвечивание/ скрытие

//пунктаменю RUN в моментоткрытия менюFILE

begin

if(UpperCase(ExtractFileExt(MainForm.FileList.FileName))='.EXE') or

(UpperCase(ExtractFileExt(MainForm.FileList.FileName))='.COM') then

Open.Enabled:=True

else Open.Enabled:=False;

end;


procedure TMainForm.OpenClick(Sender:TObject);

//Запускприложениясо строкойпараметров

begin

GetFormToCenter(RunForm);

RunForm.ShowModal;

end;


procedure TMainForm.DrBoxChange(Sender:TObject);

//Сменатекущего дискаи обнослениеСФ и СД

Var F:TSearchRec;

s:string;

begin

MainForm.Directory.Drive:=MainForm.DrBox.Drive;

MainForm.FileList.Directory:=MainForm.DrBox.Drive+':\';

S:=MainForm.FileList.Mask;

MainForm.FileList.Mask:='>.>';

FindFirst(MainForm.DrBox.Drive+':\*.*',faDirectory,F);

Repeat

Until ((FindNext(F)0) or((F.Attr=faDirectory) and ((F.Name'.') or (F.Name'..'))));

if F.AttrfaDirectory then

MainForm.Directory.SetDirectory(MainForm.DrBox.Drive+':\')

else

MainForm.Directory.SetDirectory(MainForm.DrBox.Drive+':\'+F.Name);

MainForm.Directory.BuildTree;

MainForm.Directory.SetDirectory(MainForm.DrBox.Drive+':\');

MainForm.FileList.Enabled:=True;

MainForm.FileList.Mask:=s;

MainForm.StatusBar.Panels[0].Text:=IntToStr(MainForm.FileList.Items.Count)+

' files ';

end;


procedure TMainForm.UpClick(Sender:TObject);

//Перходна один уровеньвверх в спискедиректорий

Var

i:integer;

Str:string;

begin

str:=MainForm.Directory.Directory;

for i:=Length(Str) downto 0 do

if Str[i]='\' then

begin

str[i+1]:=#0;

break;

end;

MainForm.Directory.Directory:=str;

MainForm.Directory.BuildTree;

end;


procedure TMainForm.SCutClick(Sender:TObject);

// Нажатакнопка ВЫРЕЗАТЬна панелиинструментов

begin

//Еслиактивен СФ товыреззать файлы

if MainForm.FileList.Focused then

begin

FlagMoveFile:=True;

CopyPathFileInTemp;

end;

//Еслиактивен СД товырезать директорию

If MainForm.Directory.Focused then

begin

SourseDir:=MainForm.Directory.Directory;

DoingWithDir:=False;

MainForm.CMDirList.Items.Add(MainForm.Directory.Directory);

GreateCopyMoveDirList(MainForm.Directory.Directory);

end;

end;


procedure TMainForm.SPasteClick(Sender:TObject);

//На панелиинструментовнажата кнопкаВСТАВИТЬ

begin

// Определить(по заполнениювременныхсписков) чтонеобходимовставить

// файлыили директории

ifMainForm.TempCopyMove.Items.Count0 then

begin

ProgressForm.Show;

PasteFileFromTemp;

ProgressForm.Close;

end;

IfMainForm.CMDIrList.Items.Count0 then

begin

DestinationDir:=MainForm.Directory.Directory;

PasteDirectory(SourseDir,MainForm.Directory.Directory);

MainForm.Directory.BuildTree;

If not DoingWithDir then

begin

DelNotEmptyDirectory(SourseDir);

MainForm.Directory.BuildTree;

end;

MainForm.CMDirList.Clear;

end;

end;


procedure TMainForm.SDelClick(Sender:TObject);

//на панелинажата кнопкаУДАЛИТЬ

begin

if (MainForm.FileList.Focused) and(MainForm.FileList.SelCount>0) then

begin

AskDeleteForm.ShowModal;

end;

if MainForm.Directory.Focused then

begin

IndexDeleteDirectory:=MainForm.Directory.SelectedItem;

MainForm.CMDirList.Clear;

MainForm.CMFileList.Clear;

DeleteEmptyDirectory(MainForm.Directory.Directory);

MainForm.Directory.Invalidate;

end;

end;


procedure TMainForm.SCopyClick(Sender:TObject);

//На панелинажата кнопкаКОПИРОВАТЬ

begin

If MainForm.Directory.Focused then

begin

SourseDir:=MainForm.Directory.Directory;

DoingWithDir:=True;

CopyMoveDirectory;

end;

If MainForm.FileList.Focused then

begin

FlagCopyFile:=True;

FlagMoveFile:=False;

CopyPathFileInTemp;

end;

end;


procedureTMainForm.FileListClick(Sender: TObject);

begin

MainForm.SDel.Enabled:=True;

MainForm.SCopy.Enabled:=True;

MainForm.SCut.Enabled:=True;

end;


procedure TMainForm.CutDirClick(Sender:TObject);

// ВырезаниеДиректории

begin

SourseDir:=MainForm.Directory.Directory;

DoingWithDir:=False;

MainForm.CMDirList.Items.Add(MainForm.Directory.Directory);

GreateCopyMoveDirList(MainForm.Directory.Directory);

end;


procedure TMainForm.Cut1Click(Sender:TObject);

// Вырезаниев зависимостиот контекста

begin

if MainForm.FileList.Focused then

begin

FlagMoveFile:=True;

CopyPathFileInTemp;

end;

If MainForm.Directory.Focused then

begin

SourseDir:=MainForm.Directory.Directory;

DoingWithDir:=False;

MainForm.CMDirList.Items.Add(MainForm.Directory.Directory);

GreateCopyMoveDirList(MainForm.Directory.Directory);

end;

end;


procedure TMainForm.Copy1Click(Sender:TObject);

// Копированиев зависимостиот контекста

begin

If MainForm.Directory.Focused then

begin

SourseDir:=MainForm.Directory.Directory;

DoingWithDir:=True;

CopyMoveDirectory;

end;

If MainForm.FileList.Focused then

begin

FlagCopyFile:=True;

FlagMoveFile:=False;

CopyPathFileInTemp;

end;

end;


procedure TMainForm.Paste1Click(Sender:TObject);

// Вставкав зависимостиот контекста

begin

ifMainForm.TempCopyMove.Items.Count0 then

begin

ProgressForm.Show;

PasteFileFromTemp;

ProgressForm.Close;

end;

IfMainForm.CMDIrList.Items.Count0 then

begin

DestinationDir:=MainForm.Directory.Directory;

PasteDirectory(SourseDir,MainForm.Directory.Directory);

MainForm.Directory.BuildTree;

If not DoingWithDir then

begin

DelNotEmptyDirectory(SourseDir);

MainForm.Directory.BuildTree;

end;

MainForm.CMDirList.Clear;

end;

end;


procedureTMainForm.Delete1Click(Sender: TObject);

//Удалениев зависимостиот контекста

begin

if (MainForm.FileList.Focused) and(MainForm.FileList.SelCount>0) then

begin

AskDeleteForm.Show;

end;

if MainForm.Directory.Focused then

begin

IndexDeleteDirectory:=MainForm.Directory.SelectedItem;

MainForm.CMDirList.Clear;

MainForm.CMFileList.Clear;

DeleteEmptyDirectory(MainForm.Directory.Directory);

MainForm.Directory.Invalidate;

end;

end;


procedure TMainForm.RenameClick(Sender:TObject);

// Переименованиев зависимостиот контекста

begin

If MainForm.Directory.Focused then

begin

GetFormToCenter(RenameDirForm);

RenameDirForm.ShowModal;

end;

if MainForm.FileList.Focused then

begin

RenameFileForm.ShowModal;

end;

end;


procedure TMainForm.FormResize(Sender:TObject);

// Наложениеограниченийна минимальныеразмеры главнойформы

begin

if MainForm.Width

MainForm.Width:=391;

if MainForm.Height

MainForm.Height:=260;

end;


procedureTMainForm.InvertSelectClick(Sender: TObject);

begin

ReselectAllFile;

end;


procedureTMainForm.FileListKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

// Клавишаотпущена приработе с СФ

Var

i:integer;

F:TSearchRec;

str:string;

begin

// Обновлениестатус-строки

str:=' ';

Size:=0;

for i:=0 toMainForm.FileList.Items.Count-1 do

begin

ifMainForm.FileList.Selected[i] then

begin

FindFirst(MainForm.FileList.Items[i],faAnyFile,F);

Size:=Size+F.Size;

ifMainForm.FileList.SelCount=1 then break;

end;

end;

ifMainForm.FileList.SelCount=1 then

begin

MainForm.StatusBar.Panels[1].Text:=ExtractFileName(F.Name)+' '+

FormatSize(IntToStr(F.Size))+' b'+' '+

DateToStr(FileDateTime(F.Name))+' '+TimeToStr(FileDateTime(F.Name));

end

else

begin

MainForm.StatusBar.Panels[1].Text:=FormatSize(intToStr(Size))+' b'+

' in'+IntToStr(MainForm.FileList.SelCount)+ ' selected files';

end;

end;


procedureTMainForm.SelectallClick(Sender: TObject);

begin

SelectAllF('*');

end;

end.


Вспомогательные модули


unit UMainForm_;//Вспомогательныймодуль программы


interface

uses

Windows, Messages,SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Menus,IniFiles,ExtCtrls,ComCtrls, StdCtrls, FileCtrl, Grids, Outline, DirOutln,

ToolWin, Buttons;

Const

FL1='1 column';

FL2='2 column';

FL3='3 column';

Var

AskExit:boolean;

MCIni:TIniFile;

FlagCopyFile:Boolean;

FlagMoveFile:Boolean;


FunctionFloatToInt(x:real):integer;

Procedure SaveIniMainForm;

Procedure ReadIniMainForm;

Procedure SetUpMainForm;

ProcedureGetFormToCenter(Form:TForm);

FunctionFormatSize(S:String):String;

Procedure UpdateMC;

Procedure WriteIniOptions;

Procedure ReadIniOptions;

Procedure SetUpComponents;


Var

ColDeleteFiles,ColFilesIn_TempCopyMove:integer;

AllDeleteFlag,DeleteFlag:boolean;

ResultFDCFFlag:integer;

FDel:boolean;


ProcedureCopyPathFileInTemp;

FunctionCreateStringForTemp(i:integer):string;

ProcedurePasteFileFromTemp;

FunctionGetSizeAllFiles(List:TListBox):Integer;

ProcedureDeleteEmptyDirectory(Dir:string);

ProcedureCheckForOverwrite(Str:string;x:integer);


Var

Ddir:string;

DoingWithDir:boolean;

DirSourse:string;


ProcedureGreateCopyMoveDirList(DirS:string);

ProcedureCopyMoveDirectory;


implementation


Uses UMainForm,UOptionsForm, FMXUtils, UAskDeleteForm, UAskDeleteCurrentFile,

UDeleteDir;


ProcedureCopyMoveDirectory;

//Копированиеперенос директорий

begin

MainForm.CMDirList.Clear;

MainForm.CMFileList.Clear;

MainForm.CMDirList.Items.Add(MainForm.Directory.Directory);

//Созданиевременныхсписков

GreateCopyMoveDirList(MainForm.Directory.Directory);

end;


ProcedureGreateCopyMoveDirList(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

MainForm.CMDirList.Items.Add(DirS+'\'+D.Name);

GreateCopyMoveDirList(DirS+'\'+D.Name);

end

else

begin

MainForm.CMFileList.Items.Add(DirS+'\'+D.Name);

end;

end;

Until(FindNext(D) 0);

FindClose(D);

end;


ProcedureCheckForOverwrite(Str:string;x:integer);

// Проверкасуществованияфайлов и перезаписьего по желаниюпользователяпри вставке

Var

i:integer;

FilePaste:string;

FileinDir:string;

MStr:PChar;

begin

FilePaste:=ExtractFileName(Str);

for i:=0 toColAllFiles-1 do

begin

Str:=MainForm.FileList.Items[i];

FileInDir:=Str;

ifFilePaste=FileInDir then

begin

Str:='OverWrite '+MainForm.TempCopyMove.Items[x];

Mstr:=PChar(Str);

// Найден файл, запрос на егоперезапись

if Application.MessageBox(MStr,'Warning',1)1 then

begin

MainForm.TempCopyMove.Items[x]:=MainForm.TempCopyMove.Items[x]+'*';//.Delete(x);

ColFilesIn_TempCopyMove:=ColFilesIn_TempCopyMove-2;

end;

end;

end;

end;


ProcedureDeleteEmptyDirectory(Dir:String);

//Удалениепустой директории

Var

i:integer;

begin

{$I-}

i:=MainForm.Directory.SelectedItem;

MainForm.Directory.Directory:=(MainForm.Directory.Drive+':\');

RmDir(Dir);

if IOResult 0 then

begin

GetFormToCenter(FDeleteDir);

FDeleteDir.LDir.Caption:=Dir;

FDeleteDir.ShowModal;

ifFdel then

begin

MainForm.Directory.Delete(i);

RmDir(Dir);

end

Else

begin

MainForm.Directory.SetDirectory(Dir);

MainForm.Directory.BuildTree;

end;

end

ElseMainForm.Directory.Delete(i);

{$I+}

MainForm.Directory.Update;

MainForm.CMDirList.Items.Clear;

MainForm.CMFileList.Items.Clear;

end;


FunctionGetSizeAllFiles(List:TListBox):Integer;

// Определениеразмера всехфайлов дляпрогресс формы

Var

i:integer;

Size:integer;

begin

Size:=0;

For i:=0 toList.Items.Count-1 do

begin

Size:=Size+GetFileSize(List.Items[i]);

end;

GetSizeAllFiles:=Size;

end;


ProcedurePasteFileFromTemp;

//Вставкафайлов

Var

StrPaste:string;

Str:string;

i:integer;

begin

//Формированиепараметровдля вставкифайлов

IfMainForm.Directory.Directory[Length(MainForm.Directory.Directory)]'\'then

begin

StrPaste:=MainForm.Directory.Directory+'\';

end

else

begin

StrPaste:=MainForm.Directory.Directory;

end;

//Проверкавсего спискавставляемыхфайлов на перезапись

Fori:=0 to MainForm.TempCopyMove.Items.Count-1 do

CheckForOverwrite(MainForm.TempCopyMove.Items[i],i);

For i:=0 toMainForm.TempCopyMove.Items.Count-1 do

begin

Str:=MainForm.TempCopyMove.Items[i];

//Определениедействия надфайлами копироватьили перемещать

IfFlagMoveFile then

begin

if Str[Length(str)]'*' then

MoveFile(MainForm.TempCopyMove.Items[i],StrPaste);

end

else

begin

if Str[Length(str)]'*' then

CopyFile(MainForm.TempCopyMove.Items[i],StrPaste);

end;

IfStr[Length(str)]='*' then

begin

Str[Length(str)]:=#0;

MainForm.TempCopyMove.Items[i]:=Str;

end;

end;

MainForm.FileList.Update;

IfFlagMoveFile then

begin

FlagMoveFile:=False;

MainForm.TempCopyMove.Clear;

end;

end;


FunctionCreateStringForTemp(i:integer):string;

//Созданиестроки длявременногосписка

Var

Str:string;

begin

Str:=MainForm.Directory.Directory;

IfStr[Length(Str)]'\' then

begin

Str:=Str+'\';

end;

Str:=Str+MainForm.FileList.Items[i];

CreateStringForTemp:=Str;

end;


ProcedureCopyPathFileInTemp;

//Созданиевременногосписка файлов

Var

i:integer;

begin

ColFilesIn_TempCopyMove:=0;

MainForm.TempCopyMove.Clear;

for i:=0 toColAllFiles-1 do

begin

ifMainForm.FileList.Selected[i] then

begin

ColFilesIn_TempCopyMove:=ColFilesIn_TempCopyMove+1;

If FlagMoveFile then

begin

MainForm.TempCopyMove.Items.Add(CreateStringForTemp(i));

MainForm.FileList.Items[i]:='';

end

else

begin

MainForm.TempCopyMove.Items.Add(CreateStringForTemp(i));

end;

end;

end;

end;


Procedure SetUpComponents;

begin

MainForm.StatusBar.Panels[0].Width:=MainForm.Directory.Width;

end;


Procedure ReadIniOptions;

//Чтениепараметровиз ини файла

vartmpinteger:integer;

begin

withOptionsForm do

begin

AskOnExit.Checked:=MCIni.ReadBool('Options','AskOnExit',True);

CStatusBar.Checked:=MCIni.ReadBool('Options','StatusBar',True);

tmpinteger:=MCIni.ReadInteger('Options','FileListColumns',1);

Case tmpinteger of

1 : LFileList.Caption:=FL1;

2 : LFileList.Caption:=FL2;

3 : LFileList.Caption:=FL3;

end; //Case

end;

end;


ProcedureWriteIniOptions;

// Записьпараметровв ини файл

begin

with MCInido

begin

WriteBool('Options','AskOnExit',OptionsForm.AskOnExit.Checked);

WriteBool('Options','StatusBar',OptionsForm.CStatusBar.Checked);

Case MainForm.FileList.Columns of

1 : WriteInteger('Options','FileListColumns',1);

2 : WriteInteger('Options','FileListColumns',2);

3 : WriteInteger('Options','FileListColumns',3);

end; //case

end;

end;


Procedure UpdateMC;

// Обновлениеинтерфейсныхпараметровпрограммы

begin

ifOptionsForm.AskOnExit.Checked then AskExit:=True

elseAskExit:=False;

IfOptionsForm.CStatusBar.Checked then MainForm.StatusBar.Visible:=True

elseMainForm.StatusBar.Visible:=False;

ifOptionsForm.LFilelist.Caption=FL1 then

begin

MainForm.FileList.Columns:=1;

MainForm.FileList.Update;

end;

ifOptionsForm.LFilelist.Caption=FL2 then

begin

MainForm.FileList.Columns:=2;

MainForm.FileList.Update;

end;

ifOptionsForm.LFilelist.Caption=FL3 then

begin

MainForm.FileList.Columns:=3;

MainForm.FileList.Update;

end;

end;


Procedure SetUpMainForm;

begin

//Подключениефайла параметров

MCIni:=TIniFile.Create('MC.Ini');

ReadIniMainForm;

end;


Procedure ReadIniMainForm;

begin

withMainForm do

begin

Top:=MCIni.ReadInteger('ASWindow','Top',100);

Left:=MCIni.ReadInteger('ASWindow','Left',100);

Height:=MCIni.ReadInteger('ASWindow','Height',100);

Width:=MCIni.ReadInteger('ASWindow','Width',100);

Directory.Width:=McIni.ReadInteger('ASWindow','Splitter',100);

end;

end;


Procedure SaveIniMainForm;

begin

ifMainForm.Top-4 then

begin

MCIni.WriteInteger('ASWindow','Top',MainForm.Top);

MCIni.WriteInteger('ASWindow','Left',MainForm.Left);

MCIni.WriteInteger('ASWindow','Width',MainForm.Width);

MCIni.WriteInteger('ASWindow','Height',MainForm.Height);

end;

end;


FunctionFloatToInt(x:real):integer;

begin

FloatToInt:=StrToInt(FloatToStr(Int(X)));

end;


ProcedureGetFormToCenter(Form:TForm);

begin

Form.Top:=FloatToInt(MainForm.Top+MainForm.Height/2-Form.Height/2);

Form.Left:=FloatToInt(MainForm.Left+MainForm.Width/2-Form.Width/2);

end;


FunctionFormatSize(S:String):String;

// переводцелого числав читабельныйформат (дляразмеров файлов/ директорий)

Var

i,j,n:integer;

Tmp,Temp:String;

begin

Tmp:='';

fori:=Length(S) downto 1 do

tmp:=tmp+S[i];

n:=0;

for i:=1 toLength(tmp) do

begin

ifn=3 then

begin

n:=0;

Temp:=Temp+',';

end;

Temp:=Temp+Tmp[i];

n:=n+1;

end;

Tmp:='';

fori:=Length(Temp) downto 1 do

Tmp:=Tmp+Temp[i];

FormatSize:=Tmp;

end;

end.


unit UNotTrivial;//Вспамагательныймодуль программы


interface


Uses

Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Buttons;


Var

IndexDelDir:integer;

CurDeleteDir:string;

Yes,No,All:boolean;

SourseDir:String;

DestinationDir:String;

IndexDeleteDirectory:integer;


ProcedureDelOneFile(dFile:string;Flag:boolean);

ProcedureDelNotEmptyDirectory(Dir:String);

ProcedurePasteDirectory(SDir,DDir:string);

ProcedureCreateDirInDestin(S,D:string);

Procedure SortCMDirList;


implementation

Uses

UMainForm,UMainForm_, UDeleteDir, DirOutLn, UAskDeleteCurrentFile,

FMXUtils,UProgressForm;


ProcedureDelNotEmptyDirectory(Dir:string);

//Удалениене пустой директории

Var

i:integer;

Max:integer;

EndFor:integer;

begin

//Созданиевременныхсписков

GreateCopyMoveDirList(dir);

//Удалениефайлов из всехподдиректорий

For i:=0 toMainForm.CMFileList.Items.Count-1 do

begin

DelOneFile(MainForm.CMFileList.Items[i],True);

FDeleteDir.Label1.Visible:=False;

FDeleteDir.LDir.Caption:='File '+MainForm.CMFileList.Items[i]+' isnow deleting';

FdeleteDir.Update;

end;

//Сортировкавременногосписка директорийпо возврастанию

SortCMDirList;

//Удалениеуже пустыхдиректорий

Fori:=MainForm.CMDirList.Items.Count-1 downto 0 do

begin

{$I-}

RmDir(MainForm.CMDirList.Items[i]);

FDeleteDir.LDir.Caption:='Directory '+MainForm.CMDirList.Items[i]+'is now deleting';

FDeleteDir.Label1.Visible:=False;

FdeleteDir.Update;

ifIOResult0 then

begin

MainForm.CMDirList.Items.Clear;

MainForm.CMFileList.Items.Clear;

Exit;

end;

MainForm.CMDirList.Items.Delete(i);

end;

end;


FunctionDesideSlash(str:string):integer;

// Подсчётколичества"\" для сортировки

Var

D,r:integer;

begin

d:=0;

for r:=0 toLength(str) do

ifstr[r]='\' then d:=d+1;

DesideSlash:=D;

end;


Procedure SortCMDirList;

//Пузырьковаясортировкасписка директорий

Vari:integer;

Strl,StrH:string;

Flag:Boolean;

begin

Flag:=False;

ifMainForm.CMDirList.Items.Count=0 then Flag:=true;

IfMainForm.CMDirList.Items.Count1 then

repeat

For i:=0 toMainForm.CMDirList.Items.Count-2 do

begin

strl:=MainForm.CMDirList.Items[i];

StrH:=MainForm.CMDirList.Items[i+1];

ifDesideSlash(StrL)>DesideSlash(StrH) then

begin

MainForm.CMDirList.Items[i]:=StrH;

MainForm.CMDirList.Items[i+1]:=StrL;

end;

end;

For i:=0 toMainForm.CMDirList.Items.Count-2 do

begin

ifDesideSlash(MainForm.CMDirList.Items[i])

begin

Flag:=True;

end

else

begin

Flag:=False;

Break;

end;

end;

Until(Flag);

end;


ProcedureCreateOneDirInDes(d,s,str:string);

Vari,Point:integer;

begin

For i:=0 toLength(str) do

if(str[i]s[i]) or (str[i]='\') then

begin

if (Str[i]='\') and (Str[i+1]=S[i+1]) then Point:=i

else break;

end;

ifD[Length(D)]='\' then Point:=Point+1;

Fori:=Point to Length(str) do


d:=d+str[i];

if notCreateDir(D) then

begin

end

else

begin

MainForm.Directory.SetDirectory(D);

MainForm.Directory.BuildTree;

end;

end;


ProcedureCreateDirInDestin(S,D:string);

//Созданиедерева директорийпри копировании/переносе

Var

P,i,j:integer;str,str1:string;

EndFor:integer;

begin

MainForm.StatusBar.Panels[1].Text:='Builddestination Tree, Please Wait....';

SortCMDirList;

For i:=0 toMainForm.CMDirList.Items.Count-1 do

begin

str:=MainForm.CMDirList.Items[i];

CreateOneDirInDes(D,S,str);

end;

end;


FunctionCheskSizeInDestination:boolean;

// Проверкадоступногоместа на диске

Var

i:integer;

Size:integer;

begin

For i:=0 toMainForm.CMFileList.Items.Count-1 do

size:=size+GetFileSize(MainForm.CMFileList.Items[i]);

ifDiskFree(0)

CheskSizeInDestination:=False

else

CheskSizeInDestination:=True;

end;


FunctionCreateDestinPathForFile(S,D,f:string):string;

Var

Point,i:integer;

begin

For i:=0 toLength(s) do

ifS[i]='\' then Point:=i;

ifD[Length(d)]='\' then Point:=Point+1;

Fori:=Point to Length(f) do

d:=d+f[i];

Fori:=Length(d) downTo 0 do

ifD[i]='\' then

begin

D[i+1]:=#0;

Break;

end;

CreateDestinPathForFile:=d;

end;


ProcedurePasteFileInDest(S,D:string);

//Вставкафайлов прикопир. /перен.директории

Var

i:integer;

Str:string;

F:String;

begin

MainForm.Directory.Repaint;

GetFormToCenter(ProgressForm);

ProgressForm.Show;

SizeAllCopy:=GetSizeAllFiles(MainForm.CMFileList);

While(MainForm.CMFileList.Items.Count0) do

begin

Str:=CreateDestinPathForFile(S,D,MainForm.CMFileList.Items[0]);

CopyFile(MainForm.CMFileList.Items[0],Str);

Ifnot DoingWithDir then

DelOneFile(MainForm.CMFileList.Items[0],False);

MainForm.CMFileList.Items.Delete(0);

end;

ProgressForm.Close;

MainForm.FileList.Update;

end;


ProcedurePasteDirectory(SDir,DDir:string);

//Вставкадиректории

Var

i:integer;

begin

ifCheskSizeInDestination then

begin

CreateDirInDestin(SDir,DDir);

PasteFileInDest(Sdir,DDir);

ifnot DoingWithDir then

begin

end;

end

else

begin

ifDoingWithDir then

begin

Application.MessageBox('Not Free Spase','Error',MB_APPLMODAL+MB_OK);

end

else

begin

end;

end;


end;


ProcedureDelOneFile(dFile:string;Flag:boolean);

//Удалениеодного файла

Var

F:TSearchRec;

begin

if flagthen

begin

FileSetAttr(dFile,faArchive);

DeleteFile(dFile)

end

else

begin

FindFirst(dFile,faAnyFile,F);

if(F.Attr=32) or (F.Attr=0) then

DeleteFile(dFile)

else

begin

AskDeleteCurrentFile.FileName.Caption:=F.Name;

AskDeleteCurrentFile.FileName.Caption:=AskDeleteCurrentFile.FileName.Caption+'is Read Only';

AskDeleteCurrentFile.ShowModal;

if not No Then

begin

FileSetAttr(dFile,faArchive);

DeleteFile(dFile);

end;

end;

end;

FindClose(f);

end;

end.


Формапоиска файловпо маске





unit UFindForm; // Формапоиска файлов


interface


uses

Windows, Messages,SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ComCtrls,Tabnotbk, StdCtrls, Buttons, Menus, ExtCtrls;


type

TFindForm = class(TForm)

FileWasFind: TListBox;

StatusFind:TStatusBar;

Table:TTabbedNotebook;

BitBtn1: TBitBtn;

CBFindMask: TComboBox;

Label1: TLabel;

GroupBox1: TGroupBox;

RBCurDir:TRadioButton;

RBCurDrive:TRadioButton;

RBAllDrives:TRadioButton;

GroupBox2: TGroupBox;

LCurDir: TLabel;

ExitSearch: TButton;

Label2: TLabel;

Label3: TLabel;

DateIsAfter:TDateTimePicker;

DateIsBefore:TDateTimePicker;

Label4: TLabel;

Label5: TLabel;

SGreater: TEdit;

SLess: TEdit;

CBAdvSearch:TCheckBox;

Menu: TPopupMenu;

Run1: TMenuItem;

GoTo1: TMenuItem;

CBCase: TCheckBox;

B2: TBitBtn;

B1: TButton;

Timer1: TTimer;

procedureFormActivate(Sender: TObject);

procedureBitBtn1Click(Sender: TObject);

procedureCBFindMaskDropDown(Sender: TObject);

procedureRBCurDirClick(Sender: TObject);

procedureRBCurDriveClick(Sender: TObject);

procedureRBAllDrivesClick(Sender: TObject);

procedureExitSearchClick(Sender: TObject);

procedureCBAdvSearchClick(Sender: TObject);

procedureMenuPopup(Sender: TObject);

procedureRun1Click(Sender: TObject);

procedureGoTo1Click(Sender: TObject);

procedureB2Click(Sender: TObject);

procedureB1Click(Sender: TObject);

procedureTimer1Timer(Sender: TObject);

procedureFormClose(Sender: TObject; var Action: TCloseAction);

private

public

ProcedureFindInCurrentDir(CurDir:string);

end;


Type

PRec = ^TRec;

TRec = record

Name:TSearchRec;

SubDir:string;

Next:PRec;

end;


var


FindForm: TFindForm;

FileMaskToFind:array[1..10] of string;

EndFindFlag:boolean;


ProcedureZdvigMask(s:string);

Procedure InitFileMask;

Procedure WhereFind;

Procedure FindFile;

Procedure FindInAllDr;

functionCompareFileWithMask(FileName:string):boolean;


implementation


uses UMainForm,FmxUtils;

{$R *.DFM}


functionCompareFileWithMask(FileName:string):boolean;

//Сравнениеимени и расширенияочередногофайла с маской

Var

MaskN,Mask,MaskR,FN,FR:string;

EndFor,i,j:integer;

tmp,R:boolean;

begin

FN:='';

Mask:=FindForm.CBFindMask.Text;

if notFindForm.CBCase.Checked then

begin

Mask:=UpperCase(Mask);

FileName:=UpperCase(FileName);

end;

FR:=ExtractFileExt(FileName);

For i:=1 toLength(FileName) do

ifFileName[i]'.' then

FN:=FN+FileName[i]

elsebreak;

For i:=1 toLength(Mask) do

ifMask[i]'.' then

MaskN:=MaskN+Mask[i]

elsebreak;

MaskR:=ExtractFileExt(Mask);

//началомучений с расширением

ifLength(MaskR)

EndFor:=Length(MaskR)

else

EndFor:=Length(FR);

if(MaskR[2]='*') and (FR'') then

begin

j:=Length(MaskR);

fori:=Length(FR) downTo Length(Fr)-EndFor do

begin

if (MaskR[j]=FR[i]) and (MaskR[j]'*') then

begin

j:=j-1;

R:=True;

end

Else

if (MaskR[j]='*') and (R=True) then

begin

break;

end

else

begin

R:=False;

Break;

end;

end;

end;

IfMaskR[Length(MaskR)]='*' then

begin

j:=1;

fori:=1 to EndFor do

begin

if (MaskR[j]=FR[i]) and (MaskR[j]'*') then

begin

j:=j+1;

R:=True;

end

else

begin

if (MaskR[j]='*') and (R=True) then

begin

break;

end

else

begin

R:=False;

Break;

end;

end;

end;

end;

for i:=0 toLength(MaskR) do

ifMaskR[i]'*' then

tmp:=True

else

begin

tmp:=False;

break;

end;

if tmp then

ifLength(MaskR)=Length(FR) then

begin

for i:=0 to Length(FR) do

if MaskR[i]=FR[i] then

R:=True

else

begin

R:=False;

break;

end;

end

else

begin

R:=False;

end;

//вродеконец с мучениямипо расширению

//началомучений с именем

if R then

begin

ifLength(MaskN)

EndFor:=Length(MaskN)

elseEndFor:=Length(FN);

ifMaskN[1]='*' then

begin

j:=Length(MaskN);

for i:=Length(FN) downto Length(FN)-EndFor do

begin

if (MaskN[j]=FN[i]) and (MaskN[j]'*') then

begin

j:=j-1;

R:=True;

end

else

begin

if (MaskN[j]='*')and(R=True) then

begin

break;

end

else

begin

r:=false;

break;

end;

end;

end;

end;

ifMaskN[Length(MaskN)]='*' then

begin

j:=0;

for i:=0 to EndFor do

begin

if (MaskN[j]=FN[i]) and (MaskN[j]'*') then

begin

j:=j+1;

r:=True;

end

else

begin

if (MaskN[j]='*')and(R=True) then

break

else

begin

R:=False;

break;

end;

end;

end;

end;

for i:=0to Length(MaskN) do

ifMaskN[i]'*' then

tmp:=True

else

begin

tmp:=False;

break;

end;

if tmpthen

ifLength(MaskN)Length(FN) then

r:=False

else

begin

for i:=0 to Length(MaskN) do

if MaskN[i]=FN[i] then

r:=True

else

begin

r:=False;

break;

end;

end;

end;

CompareFileWithMask:=R;

end;


Procedure FindFile;

// Поискфайла

Var

Dir:string;

SubDir:string;

Dr:Char;

begin

//Поискв текущей директории

IfFindForm.RBCurDir.Checked then

begin

Dir:=FindForm.LCurDir.Caption;

ifDir[Length(Dir)]'\' then

Dir:=Dir+'\';

FindForm.FindInCurrentDir(Dir);

end;

//Поискна текущемдиске

IfFindForm.RBCurDrive.Checked then

begin

Dir:=FindForm.LCurDir.Caption;

ifDir[Length(Dir)]'\' then

Dir:=Dir+'\';

FindForm.FindInCurrentDir(Dir);

end;

//Поискна всех дисках

IfFindForm.RBAllDrives.Checked then

begin

FindInAllDr;

end;

end;


ProcedureTFindForm.FindInCurrentDir(CurDir:string);

//РекурсивнаяПроцедурапоиска в текущейдиректориии поддиректориях

Var

SizeF:integer;

i:integer;

EndList:boolean;

F:TSearchRec;

D:string;

Key:Char;

begin

FindForm.StatusFind.Panels[1].Text:=CurDir;

FindFirst(CurDir+'*.*',faAnyFile,F);

FindNext(F);

repeat

// вставитьАSМовый код дляпрерыванияпо клавише ESC

IfFindForm.CBAdvSearch.Checked and (F.AttrfaDirectory) then

begin

ifnot(((F.Size StrToInt(FindForm.SGreater.Text)))) then Continue;

if not(((FileDateTime(CurDir+F.Name) FindForm.DateIsAfter.Date)))then Continue;

end;

ifF.Attr=faDirectory then

if(F.Name'.') and (F.Name'..') then

begin

FindInCurrentDir(CurDir+F.Name+'\');

end;

if(F.Name'..') and (F.Name'.') then

ifCompareFileWithMask(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));{ and (KeyPressed));}

FindClose(F);

end;


Procedure FindInAllDr;

//Поискна всех дисках

Var

Dir:string;

i:integer;

begin

for i:=1 toMainForm.DrBox.Items.Count-1 do

begin

dir:=MainForm.DrBox.Items.Strings[i];

dir:=UpperCase(dir[1]);

FindForm.FindInCurrentDir(dir+':\');

end;

end;


Procedure WhereFind;

//Интерфейснаячасть

Var

i:integer;

begin

ifFindForm.RBCurDir.Checked then

begin

FindForm.LCurDir.Caption:=MainForm.Directory.Directory;

end;

ifFindForm.RBCurDrive.Checked then

begin

FindForm.LCurDir.Caption:=UpperCase(MainForm.Directory.Drive)+':\';

end;

ifFindForm.RBAllDrives.Checked then

begin

FindForm.LCurDir.Caption:='';

fori:=1 to MainForm.DrBox.Items.Count-1 do

begin

FindForm.LCurDir.Caption:=FindForm.LCurDir.Caption+UpperCase(MainForm.DrBox.Items.Strings[i][1])+':\'

end;

end;

end;


Procedure InitFileMask;

//Проверкамаски поискадля дальнейшегозанесения всписок масок

Var

i:integer;

tempStr:string;

begin

tempStr:=FindForm.CBFindMask.Text;

FindForm.CBFindMask.Clear;

fori:=1 to 10 do

begin

ifFileMaskToFind[i]'' then

FindForm.CBFindMask.Items.Add(FileMaskToFind[i]);

end;

FindForm.CBFindMask.Text:=tempStr;

end;


ProcedureZdvigMask(s:string);

// Формированиесписка масокпоиска дляхранения

Var

i:integer;

tmp:boolean;

begin

ifFindForm.CBFindMask.Text'*.*' then

begin

for i:=10downto 0 do

ifFindForm.CBFindMask.Items[i]FindForm.CBFindMask.Text then

tmp:=true

else

begin

tmp:=False;

break;

end;

if tmp then

for i:=10downto 2 do

begin

FileMaskToFind[i]:=FileMaskToFind[i-1];

end;

FileMaskToFind[1]:=s;

end;

end;


procedureTFindForm.FormActivate(Sender: TObject);

//Установканачальныхзначений длявиз. компонентформы поиска

begin

Timer1.Enabled:=True;

InitFileMask;

DateIsBefore.Date:=Date;

DateIsAfter.Date:=Date;

CBFindMask.Text:='*.*';

CBCase.Checked:=False;

RBCUrDir.Checked:=True;

LCurDir.Caption:=MainForm.Directory.Directory;

SGreater.Text:='';

SLess.Text:='';

CBAdvSearch.Checked:=False;

FileWasFind.Clear;

FindForm.StatusFind.Panels[0].Text:='0';

FindForm.ActiveControl:=CBFindMask;

end;


procedureTFindForm.BitBtn1Click(Sender: TObject);

//Начатьпоиск файлов

begin

ZdvigMask(CBFindMask.Text);

FindForm.FileWasFind.Clear;

FindForm.StatusFind.Panels[0].Text:='0';

FindForm.FileWasFind.Sorted:=False;

FindForm.Refresh;

FindFile;

FindForm.FileWasFind.Sorted:=True;

FindForm.FileWasFind.Refresh;

FindForm.StatusFind.Panels[1].Text:='';

end;


procedureTFindForm.CBFindMaskDropDown(Sender: TObject);

begin

InitFileMask;

end;


procedureTFindForm.RBCurDirClick(Sender: TObject);

begin

WhereFind;

end;


procedureTFindForm.RBCurDriveClick(Sender: TObject);

begin

WhereFind

end;


procedureTFindForm.RBAllDrivesClick(Sender: TObject);

begin

WhereFind;

end;


procedureTFindForm.ExitSearchClick(Sender: TObject);

begin

FindForm.Close;

end;


procedureTFindForm.CBAdvSearchClick(Sender: TObject);

begin

ifCBAdvSearch.Checked then

begin

Table.ActivePage:='Advanced Search';

end;

end;


procedureTFindForm.MenuPopup(Sender: TObject);

var i:integer;

begin

for i:=0 toFindForm.FileWasFind.Items.Count-1 do

IfFindForm.FileWasFind.Selected[i] then

begin

FindForm.Run1.Enabled:=True;

FindForm.GoTo1.Enabled:=True;

Break;

end

else

begin

FindForm.Run1.Enabled:=False;

FindForm.GoTo1.Enabled:=False;

end;

end;


procedureTFindForm.Run1Click(Sender: TObject);

//Запускфайла из формыпоиска

Var

i:integer;

begin

For i:=0 toFindForm.FileWasFind.Items.Count-1 do

ifFindForm.FileWasFind.Selected[i] then

begin

ExecuteFile(FindForm.FileWasFind.Items[i],'','',SW_SHOW);

break;

end;

FindForm.Close;

end;


Procedure GoToFile;

// Преходв главную формук месту расположениянайденногофайла

Var

i,j:integer;

Dir,FileName:string;

begin

for i:=0 toFindForm.FileWasFind.Items.Count-1 do

begin

ifFindForm.FileWasFind.Selected[i] then

begin

FileName:=ExtractFileName(FindForm.FileWasFind.Items[i]);

FindForm.Close;

Dir:=FindForm.FileWasFind.Items[i];

forj:=Length(Dir) downTo 0 do

begin

if Dir[j]='\' then

begin

Dir[j+1]:=#0;

break;

end;

end;

MainForm.Directory.SetDrive(Dir[1]);

MainForm.Directory.Expand(1);

MainForm.Directory.SetDirectory(Dir);

MainForm.Directory.BuildTree;

MainForm.FileList.Refresh;

forj:=0 to MainForm.FileList.Items.Count-1 do

begin

if MainForm.FileList.Items[j]=FileName then

begin

MainForm.FileList.Selected[j]:=True;

MainForm.FileList.Refresh;

break;

end;

end;

break

end

end;

end;


procedureTFindForm.GoTo1Click(Sender: TObject);

begin

GotoFile;

end;


procedureTFindForm.B2Click(Sender: TObject);

begin

GotoFile;

end;


procedureTFindForm.B1Click(Sender: TObject);

begin

Run1Click(Sender);

end;


procedureTFindForm.Timer1Timer(Sender: TObject);

begin

if FileWasFind.SelCount

begin

B1.Enabled:=False;

B2.Enabled:=False;

end

else

begin

B1.Enabled:=True;

B2.Enabled:=True;

end;

end;


procedureTFindForm.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Timer1.Enabled:=False;

end;

end.


Изменённыйстандартныймодульunit


FmxUtils; //Изменённыйстандартныймодуль

//Внесйнныеизмененияотмечены "{}"


interface


uses SysUtils, Windows,Classes, Consts;


type

EInvalidDest =class(EStreamError);

EFCantMove =class(EStreamError);

procedure CopyFile(constFileName, DestName: string);

procedure MoveFile(constFileName, DestName: string);

function GetFileSize(constFileName: string): LongInt;

functionFileDateTime(const FileName: string): TDateTime;

function HasAttr(constFileName: string; Attr: Word): Boolean;

function ExecuteFile(constFileName, Params, DefaultDir: string;

ShowCmd: Integer):THandle;

{} VarAllReadByteFile:Real;

{} SizeAllCopy:Longint;

implementation


uses Forms, ShellAPI,UProgressForm, UMainForm_, UNotTrivial,UMainForm;


const

SInvalidDest ='Destination %s does not exist';

SFCantMove = 'Cannotmove file %s';


procedure CopyFile(constFileName, DestName: TFileName);

var

FileSizeProgress,ReadByteFile:Real;

CopyBuffer: Pointer; {buffer for copying }

BytesCopied: Longint;

Source, Dest: Integer; {handles }

Destination: TFileName;{ holder for expanded destination name }

const

ChunkSize: Longint =8192; { copy in 8K chunks }

begin

Destination :=ExpandFileName(DestName); { expand the destination path }

if HasAttr(Destination,faDirectory) then { if destination is a directory... }

Destination :=Destination + ExtractFileName(FileName); { ...clone file name }

GetMem(CopyBuffer,ChunkSize); { allocate the buffer }

try

Source :=FileOpen(FileName, fmShareDenyWrite); { open source file }

if Source

try

Dest :=FileCreate(Destination); { create output file; overwrite existing }

if Dest

try

//Ведениестатистикив форме прогрессакопирования

{} IfMainForm.CMFileList.Items.Count=0 then

{} SizeAllCopy:=GetSizeAllFiles(MainForm.TempCopyMove);

{} ProgressForm.ProgresCopy.Progress:=0;

{} ProgressForm.Total.Caption:=FormatSize(IntToStr(SizeAllCopy));

{} FileSizeProgress:=GetFileSize(FileName);

{} ProgressForm.LFrom.Caption:=FileName;

{} ProgressForm.LFileSize.Caption:=FormatSize(IntToStr(GetFileSize(FileName)));

{} ProgressForm.LTo.Caption:=Destination;

{} ProgressForm.Update;

{} ReadByteFile:=0;

repeat

BytesCopied :=FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }

{} ifChunkSize>GetFileSize(FileName)then

{} ReadByteFile:=ReadByteFile+GetFileSize(FileName)

{} else

{} ReadByteFile:=ReadByteFile+ChunkSize;

{} ProgressForm.LREadyWrite.Caption:=FormatSize(FloatToStr(ReadByteFile));

{} ProgressForm.Update;

{} ProgressForm.ProgresCopy.Progress:=FloatToInt(((100*ReadByteFile)/(FileSizeProgress+1)));

{End Paste}

if BytesCopied >0 then { if we read anything... }

FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }

{} ProgressForm.ProgresCopy.Repaint;

{} ProgressForm.AllProgresCopy.Repaint;

until BytesCopied

{} AllReadByteFile:=AllReadByteFile+GetFileSize(FileName);

{} ProgressForm.Ready.Caption:=FormatSize(FloatToStr(AllReadByteFile));

{} ProgressForm.AllProgresCopy.Progress:=FloatToInt(((100*(AllReadByteFile)/(SizeAllCopy+1))));

{} ProgressForm.ProgresCopy.Progress:=100;

finally

FileClose(Dest); {close the destination file }

end;

finally

FileClose(Source); {close the source file }

end;

finally

FreeMem(CopyBuffer,ChunkSize); { free the buffer }

end;

end;


{ MoveFile procedure }

{

Moves the file passed inFileName to the directory specified in DestDir.

Tries to just rename thefile. If that fails, try to copy the file and

delete the original.


Raises an exception ifthe source file is read-only, and therefore cannot

be deleted/moved.

}


procedure MoveFile(constFileName, DestName: string);

var

Destination: string;

begin

Destination :=ExpandFileName(DestName); { expand the destination path }

if notRenameFile(FileName, Destination) then { try just renaming }

begin

CopyFile(FileName,Destination); { copy it over to destination...}

DelOneFile(FileName,All);

end;

end;


{ GetFileSize function }

{

Returns the size of thenamed file without opening the file. If the file

doesn't exist, returns-1.

}


function GetFileSize(constFileName: string): LongInt;

var

SearchRec: TSearchRec;

begin

ifFindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then

Result :=SearchRec.Size

else Result := -1;

end;


functionFileDateTime(const FileName: string): System.TDateTime;

begin

Result :=FileDateToDateTime(FileAge(FileName));

end;


function HasAttr(constFileName: string; Attr: Word): Boolean;

begin

Result :=(FileGetAttr(FileName) and Attr) = Attr;

end;


function ExecuteFile(constFileName, Params, DefaultDir: string;

ShowCmd: Integer):THandle;

var

zFileName, zParams,zDir: array[0..79] of Char;

begin

Result :=ShellExecute(Application.MainForm.Handle, nil,

StrPCopy(zFileName,FileName), StrPCopy(zParams, Params),

StrPCopy(zDir,DefaultDir), ShowCmd);

end;


end.


-7-


Краткоеруководствопользователя.


Программапредназначенадля управленияфайловой системойоперационнойсистемы Windows’95/’98,в программепредусмотреныследующиевозможности:

Копирование,переименование,перенос, удалениефайлов и директорий;

Определениеи установкаатрибутовфайлов;

Расширенныйпоиск файловпо маске;

Запускпрограмм сострокой параметров;

Применениемаски-фильтрапри просмотресписка файлов;

Созданиедиректорий;

Определениеразмера директории;

Определениесуммарногообъёма дисковогопространствазанимаемогогруппой файлов;

Получениеинформациио текущем диске;

Запусквнешних программредакторовдля просмотраи редактированияфайлов;

Установкаинтерфейсныхпараметровпрограммы.


Обзоринтерфейсапрограммы МС.


Интерфейспрограммы начетыре функциональныечасти

  1. Главноеменю программы;

  2. Панельинструментов;

  3. Списокфайлов;

  4. Списокдиректорий;


Главноеменю программысодержит с себетри компонентыуправленияпрограммой:

File

View

Options

КомпонентаFileсодержит в себеосновные функцииуправленияфайлами идиректориями(см. рис. 1). Функциязапуска программRunдоступнатолько тогда,когда выделенныйфайл являетсяисполняемойпрограммой.При выбореданного пункта.Появляетсяформа, содержащаястроку параметров,а также параметрзапуска – видформы окназапуска (см.рис. 2).





Рис1. Меню File.


Рис2. Форма запускафайлов со строкойпараметров.


ФункцииCut,Copy, Paste, Delete (Вырезать,Копировать,Вставить, Удалить)– стандартныефункции управленияфайлами/директориями.При невозможностивыполнениявыше перечисленныхдействий, данныефункции недоступны.Функция Rename(Переименовать)запрашиваету пользователяновое имя дляфайла / директориив форме показаннойна рисунке 3.


Р

ис3. Переименованиефайлов / директорий


ФункцияDelete(Удаления),удаляет выделенныеэлементы взависимостиот активнойрабочей области.Если последнее,перед вызовомэтой функции,выделениепроизводилосьв области файлов,то будут удаленывыделенныефайлы, если жеактивная областьдиректорийто удаленабудет директория.

ФункцияFind(Найти) обеспечиваетрасширенныйпоиск файловпо маске в областипоиска указаннойпользователем.Параметры имаска поисказадается вформе показаннойна рисунке 4


Р


ис4. Поиск файлов.

Параметрамипоиска являютсязадание областипоиска, возможнытри области:текущая директория,текущий диски все жесткиедиски (включаяподключённыесетевые диски).Также естьвозможностьрасширенногопоиска с указаниемограниченийв дате созданияфайла созданияи его предполагаемыхразмерах. Вовремя поискав строке статусаформы отражаетсяколичествонайденныхфайлов, директорияв которойосуществляетсяпоиск. Послетого как былинайдены файлы,возможен возвратв главную формупрограммы ипереход к местуположениявыбранногофайла, а такжезапуск интересующегофайла (редактированиево внешнемредакторе, есливыбранный файлне являетсяприложением).Для удобствазадания маскипоиска предусмотренохранение 10-ипоследних масокв открывающемсясписке.

ФункцияExit(Выход)производитвыход из программы.

Всемвыше описаннымфункциям сопоставленыгорячие клавиши.


КомпонентаViewсодержитв себе функциифильтра, полученияинформациио диске, получениеи установкаатрибутовфайла, получениеразмера текущейдиректории,выделения всехфайлов находящихсяв текущей директориии инверсноевыделениефайлов.

ФункцияFileMask (Маскафильтра) запрашиваету пользователяв форме GetFile Mask маскудля отображенияфайлов. Дляотмены маскинеобходимповторный вызовфункции и заданиемаски предлагаемойпо умолчанию.

ФункцияInfo(Информация)предоставляетпользователюинформациюо текущем диске(объём свободногои занятогопространства),а также информациюо текущей директории.

ФункцияFileAttributes (Атрибутыфайла) даетвозможностьпросмотратекущих атрибутовфайла и измененияэтих атрибутов.В случае несколькихфайлов возможногрупповоеприсвоениеновых атрибутов.

ФункцияSizeDirectory (Размердиректории)выводит в статусстроке спискадиректорийразмер текущейдиректории.

ФункцияSelectAll выделяетвсе файлы,находящиесяв данной директории.

ФункцияInvertSelect инвертируетвыделениефайлов.С файлов которыебыли выделены,выделениеснимается, аостальные файлывыделяются.


КомпонентаOptions(Параметры)выводит наэкран формупараметровпрограммы смрис5, в которойпользователь


Р

ис5. Параметрыпрограммы


можетустановитьпараметрыинтерфейсапрограммы.

Параметры– наличие статусстроки, количествоколонок в спискефайлов (от 1 до3), запрашиватьподтверждениепри выходе изпрограммы. Также существуетмеханизм установкизначения параметровпо умолчанию(Запрашиватьподтверждениепри выходе,Наличие статусстроки, 1 колонкав списке файлов).


Панельинструментовсодержитв себе некоторыеиз функцийрасположенныхв главном меню,а также кнопкаперехода наодин уровеньвверх в спискедиректорийи список дисков(включая сетевыедиски подключенныеоперационнойсистемой дозапуска программы).Внешний видпанели инструментовпоказан нарисунке 6.

Р


ис6 Панель инструментов.

СписокФайлов,предназначендля просмотрасписка файловрасположенныхв текущей директории.При нажатииправой кнопкимыши вызываетсяконтекстноеменю, в которомимеются функциикопирования,удаления,переименования,вставки. Такжеу списка файловсуществуетстатус-строкав которой выводитсяинформацияо отмеченномфайле (имя, размер,дату и времясоздания). Вслучае группыотмеченныхфайлов статус–строкапоказываеткакой суммарныйобъём байтзанимают отмеченныефайлы на диске.


Списокдиректорий,предназначендля просмотрадиректорийнаходящихсяна текущемдиске. Списокимеет двевовиднуюструктурукорнем которойявляетьсятекущий диск.При нажатииправой кнопкимыши появлятьсяконтектсноеменю в которомперечисленыфункции работыс директориями.
Использованиефункций:
Какупоминалосьвыше программаимеет наборфункций работыс файлами. Некоторыетребующиеопределённойпоследоваьтельностидействий будутрассмотреныв данном разделе.
Копирование/ Перенос.
Длякопированияфайлов / директории(в дальнейшембудем говоритьтолько о файлах,так как процессыидентичны)необходимовыполнитьследующуюпоследовательностьдействий:
Выделитьфайлы которыенеобходимоскопировать
Существуютнесколькоспособов выделениягруппы файлов,(те кто хорошознаком в операционнойсистемой Windows’95этотраздел, как ивсе последующиемогут пропустить)выделениемышкой с применениемклавиш Ctrlи Shift,клавишаCtrlпредназначенадля выделенияв группу файловотдельно стоящихв списке, а клавишаShiftпредназначенадля выделения«от начальногофайла, до конечного».
Выполнитьфункцию копироватьпосредствомвыбора её излюбого вышеописанногоместа интерфейса
Выбрать местоназначениякопированияи выполнитьфункцию вставить.
Далеена экране будетотражён процесскопированияв форме Progress…
Удаление.
Удалениефайлов происходитпри помощивызова функцииудаления излюбой частиинтерфейса.После вызова,(удалить директорию)в случае еслидиректорияне пуста, будетзапрошенопотвержжениена удаление, (файл(ы)) будетзапрошенопотверждениеудаления иприведён списокудаляемыхфайлов, еслиудаляемый файлимеет атрибутыReadOnly (только длячтения) такжебудет запрошеноподтверждение.
Переименование.
Припереименованиина экран выводитьсяформа, предлагающаяввести новоеимя для файла.