Постановказадачи.
Задачазаключаетсяв разработкефайловой оболочкидля операционнойсистемы Windows’95/98.В программе реализоватьмеханизмыкопирования,переноса, удаления,переименованияфайлов и директорий,поиск файловпо маске, просмотрсписка файловпо маске, просмотри редактированиефайлов во внешнихредакторах,присвоениеи получениеатрибутовфайла, присвоениеатрибутовгруппе файлов,запуск приложенийсо строкойпараметров,создание директории,определениеразмера директории,получениеинформациио диске, настройкиинтерфейсапрограммы,определениесуммарногообъёма дисковогопространствазанимаемогогруппой файлов,восстановлениеинтерфейсныхпараметровпри повторномзапуске программы. Так же обеспечитьуправлениеоболочкой припомощи манипуляторатипа «мышь»и клавиатуры.
Методреализации.
Дляреализациипоставленнойзадачи необходимосоздать интерфейспользователясостоящий изтаких компонент:
А) списокдиректорий.
Б) списокфайлов
В) списокдисков
Г) главноеменю программы
Д) панельинструментов.
Дляорганизацииинтерфейсапользователябудут использованыстандартныевизуальныекомпонентыDelphi3.0.Для реализациимеханизмакопирования/вставки1необходимозапомнитьсписок копируемыхфайлов/директорий,каждый элементсписка долженсодержатьинформациюо месте нахожденияфайла/директориии имени файла/директории.При копированиигруппы файловили одногофайла необходимоопределитьих место положениев иерархиикаталогов, азатем заполнитьсписок, выбираявсе файлы отмеченныепользователемиз списка файловпоказанногов интерфейснойчасти программы(списке файлов).При копированиидиректориинеобходимотакже определитьеё положениеи произвестисканированиесамой директориис сохранениемв списке имёнфайлов содержащихсяв копируемойдиректориии структурыкаталогов. Длявставки директориив место копирования,необходимовоссоздатьеё структуру,а затем скопироватьв неё файлы.Для осуществленияэтого процессавышеупомянутыйсписок разбиваетсяна два. В первомсписке (назовемего временныйсписок директорий)должна находитьсяструктуракаталогов, аво втором (временномсписке файлов)расположенныев этих каталогахфайлы. Два списканеобходимыдля уменьшениявремени затраченногона копирование,так как приналичии одногосписка необходиманализ каждогоэлемента спискана предметналичия поддиректорийи создание этихподдиректорийв месте копирования,а в копируемойдиректориив большинствеслучаев количестводиректорийменьше чемколичествофайлов и временина проверкупонадобитьсябольше, чем прииспользованиидвух списков.
Еслиже использоватьдва списка тодля воссозданияструктурыкаталоговнеобходимолишь отсортироватьвременныйсписок директорийв соответствиис иерархиейкаталогов, исоздаватьдиректориипроходя посписку сверхувниз. Так какпосле сортировки,директориирасположенныена верхнихуровнях вложенностикаталогов будутнаходитьсяв верхней частисписка, а директориирасположенныена нижних уровняхбудут находитьсяв конце списка.После воссозданияструктурыдиректорииостаётся толькопереписатьфайлы.
Алгоритмзаполнениявременныхсписков показанна рисунке 1 ввиде блок схемы.Реализацияданного алгоритмабудет базированана использованиифункций FindFirstиFindNext,эти функцииосуществляютпросмотр содержимогоуказаннойдиректориии в качестверезультатавозвращаютимя найденногоэлемента, егоатрибуты, времясоздания иразмер. Прианализе атрибутовнайденногоэлемента можноопределитьданный элементдиректорияили файл, и всоответствиис анализомзаписать егоимя и положениев соответствующийсписок. На описанномалгоритме будетбазирован такжемеханизм удалениядиректории.
Упомянутыевыше функцииFindFirstиFindNext будуттакже примененыпри реализациимеханизмапоиска файловпо маске.
Описаниепрограммы.
Программареализованана языке паскальс использованием
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)
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.При удалениидиректориитак же составляютсяоба списка, нотак как стандартнойпроцедурыудаляющей непустую директориюнет, то в началеудаляются всефайлы в удаляемойдиректории(включая файлынаходящиесяв поддиректориях),а затем пустыедиректории.
Анализрезультатов.
Программаимеет все необходимыефункции работыс файлами. Всефункции можноактивизироватьнажатием комбинацииклавиш. Производитьсястатистикакопирования,переноса, удаленияфайлов/директорийв удобной длявосприятияпользователемформе. Существуетпростой механизмналоженияфильтра напоказываемыефайлы. При измененииинтерфейсапрограммы, всеизменениясохраняютсяи будут восстановленыпри следующемзапуске. Запускприложенийсо строкойпараметровс указаниемтипа запуска.Вывод сообщенияо количествеподдиректорийв директориии о количествефайлов расположенныхв ней. Определениеразмера директории присвоениеатрибутовгруппе файловпростым нажатиемдвух клавиш.
Выводы.
В ходеработы быларазработанапрограммаманипулированияфайлами идиректориями.
В программереализованыследующиемеханизмы:
копирования,переноса, удаления,переименованияфайлов и директорий,
поискфайлов по маске,
наложениефильтра насписок файлов,
просмотри редактированиефайлов во внешнихредакторах,
присвоениеи получениеатрибутовфайла,
присвоениеатрибутовгруппе файлов,
запускприложенийсо строкойпараметров,
созданиедиректории,
определениеразмера директории,
получениеинформациио диске,
настройкиинтерфейсапрограммы,
определениесуммарногообъёма дисковогопространствазанимаемогогруппой файлов,
восстановлениеинтерфейсныхпараметровпри повторномзапуске программы.
Программаимеет удобныйинтерфейс иможет использоватьсядля работыпользователямис разным уровнемзнаний.
Системныетребования:Операционнаясистема Windows’95и выше, 500 килобайтдисковогопространства.
Литература.
П.Туротт, Г. Брент,Р. Багдазиан,С.Тендон «DELPHI3», DiaSoft, Киев, 1997 г.
1Механизм копированияразбит на двечасти копирование/вставкаисходя изпредпологаемогоинтерфейсапрограммы
22Возможны 3 областипоиска: поискв текущейдиректории;поиск на текущемдиске; поискна всех жесткихдисках (такжесетевых).
33Перенос директорийне рассматриваетсяввиду того,что его алгоритмявляетсяпоследовательной
комбинациейалгоритмакопированияи алгоритмаудаления.
44Если объёмкопируемыхфайлов превышаетобъём пустогоместа в местеназначения,копированиепроизведеноне будет
-
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) 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. 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. - Краткоеруководствопользователя. Главноеменю программы; Панельинструментов; Списокфайлов; Списокдиректорий; Главноеменю программысодержит с себетри компонентыуправленияпрограммой: File View Options КомпонентаFileсодержит в себеосновные функцииуправленияфайлами идиректориями(см. рис. 1). Функциязапуска программRunдоступнатолько тогда,когда выделенныйфайл являетсяисполняемойпрограммой.При выбореданного пункта.Появляетсяформа, содержащаястроку параметров,а также параметрзапуска – видформы окназапуска (см.рис. 2).Изменённыйстандартныймодульunit
Программапредназначенадля управленияфайловой системойоперационнойсистемы Windows’95/’98,в программепредусмотреныследующиевозможности:
Копирование,переименование,перенос, удалениефайлов и директорий;
Определениеи установкаатрибутовфайлов;
Расширенныйпоиск файловпо маске;
Запускпрограмм сострокой параметров;
Применениемаски-фильтрапри просмотресписка файлов;
Созданиедиректорий;
Определениеразмера директории;
Определениесуммарногообъёма дисковогопространствазанимаемогогруппой файлов;
Получениеинформациио текущем диске;
Запусквнешних программредакторовдля просмотраи редактированияфайлов;
Установкаинтерфейсныхпараметровпрограммы.
Обзоринтерфейсапрограммы МС.
Интерфейспрограммы начетыре функциональныечасти
Рис1. Меню File.
Рис2. Форма запускафайлов со строкойпараметров.
ФункцииCut,Copy, Paste, Delete (Вырезать,Копировать,Вставить, Удалить)– стандартныефункции управленияфайлами/директориями.При невозможностивыполнениявыше перечисленныхдействий, данныефункции недоступны.Функция Rename(Переименовать)запрашиваету пользователяновое имя дляфайла / директориив форме показаннойна рисунке 3.
ФункцияDelete(Удаления),удаляет выделенныеэлементы взависимостиот активнойрабочей области.Если последнее,перед вызовомэтой функции,выделениепроизводилосьв области файлов,то будут удаленывыделенныефайлы, если жеактивная областьдиректорийто удаленабудет директория.
ФункцияFind(Найти) обеспечиваетрасширенныйпоиск файловпо маске в областипоиска указаннойпользователем.Параметры имаска поисказадается вформе показаннойна рисунке 4
Р
Параметрамипоиска являютсязадание областипоиска, возможнытри области:текущая директория,текущий диски все жесткиедиски (включаяподключённыесетевые диски).Также естьвозможностьрасширенногопоиска с указаниемограниченийв дате созданияфайла созданияи его предполагаемыхразмерах. Вовремя поискав строке статусаформы отражаетсяколичествонайденныхфайлов, директорияв которойосуществляетсяпоиск. Послетого как былинайдены файлы,возможен возвратв главную формупрограммы ипереход к местуположениявыбранногофайла, а такжезапуск интересующегофайла (редактированиево внешнемредакторе, есливыбранный файлне являетсяприложением).Для удобствазадания маскипоиска предусмотренохранение 10-ипоследних масокв открывающемсясписке.
ФункцияExit(Выход)производитвыход из программы.
Всемвыше описаннымфункциям сопоставленыгорячие клавиши.
КомпонентаViewсодержитв себе функциифильтра, полученияинформациио диске, получениеи установкаатрибутовфайла, получениеразмера текущейдиректории,выделения всехфайлов находящихсяв текущей директориии инверсноевыделениефайлов.
ФункцияFileMask (Маскафильтра) запрашиваету пользователяв форме GetFile Mask маскудля отображенияфайлов. Дляотмены маскинеобходимповторный вызовфункции и заданиемаски предлагаемойпо умолчанию.
ФункцияInfo(Информация)предоставляетпользователюинформациюо текущем диске(объём свободногои занятогопространства),а также информациюо текущей директории.
ФункцияFileAttributes (Атрибутыфайла) даетвозможностьпросмотратекущих атрибутовфайла и измененияэтих атрибутов.В случае несколькихфайлов возможногрупповоеприсвоениеновых атрибутов.
ФункцияSizeDirectory (Размердиректории)выводит в статусстроке спискадиректорийразмер текущейдиректории.
ФункцияSelectAll выделяетвсе файлы,находящиесяв данной директории.
ФункцияInvertSelect инвертируетвыделениефайлов.С файлов которыебыли выделены,выделениеснимается, аостальные файлывыделяются.
КомпонентаOptions(Параметры)выводит наэкран формупараметровпрограммы смрис5, в которойпользователь
можетустановитьпараметрыинтерфейсапрограммы.
Параметры– наличие статусстроки, количествоколонок в спискефайлов (от 1 до3), запрашиватьподтверждениепри выходе изпрограммы. Также существуетмеханизм установкизначения параметровпо умолчанию(Запрашиватьподтверждениепри выходе,Наличие статусстроки, 1 колонкав списке файлов).
Панельинструментовсодержитв себе некоторыеиз функцийрасположенныхв главном меню,а также кнопкаперехода наодин уровеньвверх в спискедиректорийи список дисков(включая сетевыедиски подключенныеоперационнойсистемой дозапуска программы).Внешний видпанели инструментовпоказан нарисунке 6.
Р
СписокФайлов,предназначендля просмотрасписка файловрасположенныхв текущей директории.При нажатииправой кнопкимыши вызываетсяконтекстноеменю, в которомимеются функциикопирования,удаления,переименования,вставки. Такжеу списка файловсуществуетстатус-строкав которой выводитсяинформацияо отмеченномфайле (имя, размер,дату и времясоздания). Вслучае группыотмеченныхфайлов статус–строкапоказываеткакой суммарныйобъём байтзанимают отмеченныефайлы на диске.