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

Тип работы:
Реферат
Предмет:
Информатика, программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

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

Модуль описує головну форму
unit UMainForm; // головна форма программы
interface
// які підключаються модулі (стандартные)
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, ComCtrls, StdCtrls, FileCtrl, Grids, Outline, DirOutln,
ToolWin, Buttons;
type
TMainForm = class (TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
About1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
Options1: TMenuItem;
Directory: TDirectoryOutline;
FileList: TFileListBox;
Drv: TDriveComboBox;
StatusBar: TStatusBar;
DirectoryMenu: TPopupMenu;
FileMenu: TPopupMenu;
Splitter: TSplitter;
Cut: TMenuItem;
Copy: TMenuItem;
Paste: TMenuItem;
Rename1: TMenuItem;
Delete: TMenuItem;
NewDir: TMenuItem;
CopyDir: TMenuItem;
RenameDir: TMenuItem;
DeleteDir: TMenuItem;
PasteDir: TMenuItem;
TempDelete: TListBox;
TempCopyMove: TListBox;
Open: TMenuItem;
View: TMenuItem;
FileMask1: TMenuItem;
CMDirList: TListBox;
DFileList: TListBox;
Find1: TMenuItem;
Info1: TMenuItem;
CMFileList: TListBox;
FileAttr: TMenuItem;
SizeDirectory1: TMenuItem;
CutDir: TMenuItem;
ToolBar1: TToolBar;
DrBox: TDriveComboBox;
Bevel1: TBevel;
Bevel2: TBevel;
SpeedButton1: TSpeedButton;
SCut: TSpeedButton;
Bevel3: TBevel;
SCopy: TSpeedButton;
SPaste: TSpeedButton;
SDel: TSpeedButton;
Up: TSpeedButton;
Bevel4: TBevel;
Cut1: TMenuItem;
Copy1: TMenuItem;
Paste1: TMenuItem;
Rename: TMenuItem;
Delete1: TMenuItem;
Selectall: TMenuItem;
InvertSelect: TMenuItem;
procedure About1Click (Sender: TObject);
procedure Exit1Click (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure Options1Click (Sender: TObject);
procedure DrivesSectionClick (HeaderControl: THeaderControl;
Section: THeaderSection);
procedure DrivesMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure NewDirClick (Sender: TObject);
procedure DirectoryChange (Sender: TObject);
procedure CopyClick (Sender: TObject);
procedure CutClick (Sender: TObject);
procedure PasteClick (Sender: TObject);
procedure Rename1Click (Sender: TObject);
procedure DeleteDirClick (Sender: TObject);
procedure DeleteClick (Sender: TObject);
procedure FileMenuPopup (Sender: TObject);
procedure FileMask1Click (Sender: TObject);
procedure FileListDblClick (Sender: TObject);
procedure SplitterMoved (Sender: TObject);
procedure Find1Click (Sender: TObject);
procedure Info1Click (Sender: TObject);
procedure CopyDirClick (Sender: TObject);
procedure RenameDirClick (Sender: TObject);
procedure FileAttrClick (Sender: TObject);
procedure ViewClick (Sender: TObject);
procedure SizeDirectory1Click (Sender: TObject);
procedure FileListMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FileListKeyPress (Sender: TObject; var Key: Char);
procedure FileListKeyDown (Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure PasteDirClick (Sender: TObject);
procedure DirectoryMenuPopup (Sender: TObject);
procedure File1Click (Sender: TObject);
procedure OpenClick (Sender: TObject);
procedure DrBoxChange (Sender: TObject);
procedure UpClick (Sender: TObject);
procedure SCutClick (Sender: TObject);
procedure SPasteClick (Sender: TObject);
procedure SDelClick (Sender: TObject);
procedure SCopyClick (Sender: TObject);
procedure FileListClick (Sender: TObject);
procedure CutDirClick (Sender: TObject);
procedure Cut1Click (Sender: TObject);
procedure Copy1Click (Sender: TObject);
procedure Paste1Click (Sender: TObject);
procedure Delete1Click (Sender: TObject);
procedure RenameClick (Sender: TObject);
procedure FormResize (Sender: TObject);
procedure InvertSelectClick (Sender: TObject);
procedure FileListKeyUp (Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure SelectallClick (Sender: TObject);
private
public
end;
var
MainForm: TMainForm;
Size: integer;
implementation
// які підключаються модулі (не стандартные)
uses UAboutBox, UMainForm_, UOptionsForm, UCreateDir, UProgressForm,
URenameForm, UAskDeleteForm, UGetFileMask, FmxUtils, UFindForm, UInfoForm,
UAttrFilesForm, UNotTrivial, UDeleteDir, URenameDirForm, URunForm,
UViewForm;
{$R *. DFM}
procedure TMainForm. About1Click (Sender: TObject);
// висновок форми «ІНФОРМАЦІЯ Про ПРОГРАМІ „
begin
AboutBox. Show;
end;
procedure TMainForm. Exit1Click (Sender: TObject);
// Обробка виходу з программы
begin
If AskExit then
begin
// Підтвердження выхода
If Application. MessageBox („Exit
? “, „Exit “, MB_APPLMODAL+MB_ICONQuestion+MB_YESNO)=IDYes then
Begin
// запис інформації про програму в файл МС. INI
SaveIniMainForm;
Close;
end
end
else
begin
SaveIniMainForm;
Close;
end;
end;
procedure TMainForm. FormCreate (Sender: TObject);
//Установканачльных параметрів для компонент головною формы
begin
SetUpMainForm;
SetUpComponents;
end;
procedure TMainForm. Options1Click (Sender: TObject);
//Висновок форми параметров
begin
// Центрування виведеної форми щодо головною формы
GetFormToCenter (OptionsForm);
OptionsForm. ShowModal;
end;
procedure TMainForm. DrivesSectionClick (HeaderControl: THeaderControl;
Section: THeaderSection);
// Зміна поточного диска
begin
Directory. Drive:=Section. Text[1];
Directory. SetDirectory (Section. Text[1]+ „: “);
MainForm. Directory. BuildTree;
end;
procedure TMainForm. DrivesMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//перерисовка списку директорій при необходимости
Directory. Repaint;
end;
procedure TMainForm. NewDirClick (Sender: TObject);
// Створення директорії та виведення відповідної формы
begin
CreateDirForm. Show;
end;
Function CountDir (Str: String):String;
// Визначення кількості поддиректорий в поточної директории
Var F: TSearchRec;
C: integer;
begin
c: =0;
findfirst (Str+ „*.* “, faAnyFile, F);
findnext (F);
repeat
if (f. Attr>=16) and (f. attr „. “) and (f. Name “. ») then
c: =c+1;
Until (findnext (f)0);
CountDir: =IntToStr (c);
end;

procedure TMainForm. DirectoryChange (Sender: TObject);
//Зміна поточної директории
begin
//Оновлення списку файлов
FileList. SetDirectory (Directory. Directory);
//Заповнення статус-строки
MainForm. StatusBar. Panels[0]. Text:=CountDir (Directory. Directory)+ «dir. &
„+IntToStr (MainForm. FileList. Items. Count)+
„files “;
MainForm. StatusBar. Panels[1]. Text:= „“;
//Визначення активних кнопок панелі управления
If UpperCase (MainForm. Directory. Directory)=UpperCase (MainForm. DrBox. Drive+ „: “)
then
begin
Up. Enabled:=False;
SCut. Enabled:=False;
SCopy. Enabled:=False;
SDel. Enabled:=False;
end
else
begin
Up. Enabled:=True;
SCut. Enabled:=True;
SCopy. Enabled:=True;
SDel. Enabled:=True;
end;
end;
procedure TMainForm. CopyClick (Sender: TObject);
// Копіювання файлов
begin
FlagCopyFile: =True;
FlagMoveFile: =False;
CopyPathFileInTemp;
end;
procedure TMainForm. CutClick (Sender: TObject);
// Вирізання файлов
begin
FlagMoveFile: =True;
CopyPathFileInTemp;
end;
procedure TMainForm. PasteClick (Sender: TObject);
begin
ProgressForm. Show;
PasteFileFromTemp;
ProgressForm. Close;
MainForm. TempCopyMove. Clear;
end;
procedure TMainForm. Rename1Click (Sender: TObject);
// Перейменування файлів у відповідній екранної форме
begin
GetFormToCenter (RenameFileForm);
RenameFileForm. ShowModal;
end;
procedure TMainForm. DeleteDirClick (Sender: TObject);
// Видалення директории
begin
// Обнуління тимчасових списков
MainForm. CMDirList. Clear;
MainForm. CMFileList. Clear;
DeleteEmptyDirectory (MainForm. Directory. Directory);
//Оновлення списку директорий
MainForm. Directory. Invalidate;
end;
procedure TMainForm. DeleteClick (Sender: TObject);
//Видалення файлов
begin
AskDeleteForm. Show;
end;
procedure TMainForm. FileMenuPopup (Sender: TObject);
//Визначення видимих рядків контектсном меню файловій области
//в останній момент його вызова
begin
if MainForm. FileList. SelCount=0 then
begin
with MainForm. FileMenu do
begin
Delete. Enabled:=False;
Cut. Enabled:=False;
Copy. Enabled:=False;
Rename1. Enabled:=False;
end;
end
else
begin
with MainForm. FileMenu do
begin
Delete. Enabled:=True;
Cut. Enabled:=True;
Copy. Enabled:=True;
Rename1. Enabled:=True;
end;
end;
if MainForm. TempCopyMove. Items. Count = 0 then
Paste. Enabled:=False
else
Paste. Enabled:=True;
end;
procedure TMainForm. FileMask1Click (Sender: TObject);
// Запит маски файлів для списку файлів (надалі СФ)
begin
GetFileMask. Show;
end;
procedure TMainForm. FileListDblClick (Sender: TObject);
// Запуск программ/редактирование (просмотр) в зовнішньому редакторе
// маючи щиглику мышкой
Var
str: string;
begin
Str: =FileList. FileName;
ExecuteFile (Str, „“, „“, SW_SHOW);
end;
procedure TMainForm. SplitterMoved (Sender: TObject);
//Переміщення роздільника СФ і Списку директорій (У Подальшому СД)
begin
// Обмеження на становище разделителя
// Ширина С Д повинна бути менше Списку дисків (Надалі СПД)
if Splitter. Left
begin
Directory. Width:=DrBox. Width+6;
end;
// Збереження становища роздільника наступного запуску программы
McIni. WriteInteger („ASWindow “, „Splitter “, MainForm. Directory. Width);
// Установка розмірів панелей статус-строки
MainForm. StatusBar. Panels[0]. Width:=MainForm. Directory. Width;
end;
procedure TMainForm. Find1Click (Sender: TObject);
// Пошук файлов
begin
FindForm. Show
end;
procedure TMainForm. Info1Click (Sender: TObject);
// Висновок інформації про поточному диску і директории
begin
GetFormToCenter (InfoForm);
InfoForm. ShowModal;
end;
procedure TMainForm. CopyDirClick (Sender: TObject);
//Копіювання директорій (Вибрано пункт меню копировать)
begin
SourseDir: =MainForm. Directory. Directory;
DoingWithDir: =True;
CopyMoveDirectory;
end;
procedure TMainForm. RenameDirClick (Sender: TObject);
//Перейменування директорії у відповідній форме
begin
GetFormToCenter (RenameDirForm);
RenameDirForm. ShowModal;
end;
procedure TMainForm. FileAttrClick (Sender: TObject);
//Одержання установка атрибутів файла в соотв. форме
begin
GetFormToCenter (AttrFileForm);
AttrFileForm. ShowModal;
end;
procedure TMainForm. ViewClick (Sender: TObject);
// Визначення видимих компонент в меню VIEW
// в останній момент його открытия
begin
if MainForm. FileList. SelCount = 0 then
begin
MainForm. FileAttr. Enabled:=False;
end
else
begin
MainForm. FileAttr. Enabled:=True;
end;
if UpperCase (MainForm. Directory. Directory)=UpperCase (MainForm. DrBox. Drive+ „: “)
then
MainForm. SizeDirectory1. Enabled:=False
else
MainForm. SizeDirectory1. Enabled:=True;
end;
Procedure DDD (DirS: string);
// Визначення розміру поточної директории
Var
d: TSearchRec;
begin
FindFirst (DirS+ „“ + „*.* “, faAnyFile, D);
FindNext (D);
repeat
if (D. Name „. “) and (D. Name “. ») then
begin
if (D. Attr=faDirectory) Or (D. Attr=18) then
begin
DDD (DirS+ «» +D. Name);
end
else
begin
Size: =Size+D. Size;
end;
end;
Until (FindNext (D) 0);
FindClose (D);
end;

procedure TMainForm. 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;
procedure TMainForm. FileListMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
// Ліва кнопка мишки отпущена
Var
i: integer;
F: TSearchRec;
str: string;
begin
str:= «»;
Size: =0;
//Якщо за допомоги мишки виділено група файлів визначити їх сумарний размер
for i: =0 to MainForm. FileList. Items. Count-1 do
begin
if MainForm. FileList. Selected[i] then
begin
FindFirst (MainForm. FileList. Items[i], faAnyFile, F);
Size: =Size+F. Size;
if MainForm. FileList. SelCount=1 then break;
end;
end;
// Якщо хтось виділений файл, вивести інформацію про нього у рядку статуса
if MainForm. 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 to MainForm. 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
if MainForm. FileList. SelCount=MainForm. FileList. Items. Count then
ReselectAllFile
else
begin
for i: =0 to MainForm. FileList. Items. Count-1 do
MainForm. FileList. Selected[i]:=True;
str:= «»;
Size: =0;
// Оновлення Статус-строки
for i: =0 to MainForm. FileList. Items. Count-1 do
begin
if MainForm. FileList. Selected[i] then
begin
FindFirst (MainForm. FileList. Items[i], faAnyFile, F);
Size: =Size+F. Size;
if MainForm. FileList. SelCount=1 then break;
end;
end;
if MainForm. 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;

procedure TMainForm. FileListKeyPress (Sender: TObject; var Key: Char);
begin
SelectAllF (Key);
end;
procedure TMainForm. FileListKeyDown (Sender: TObject; var Key: Word;
Shift: TShiftState);
//Натиснута клавіша на клавиатуре
Var
i: integer;
F: TSearchRec;
str: string;
begin
// якщо натиснутий ENTER запустити файл
if (Key=13) and not AskDeleteForm. Active then
ExecuteFile (FileList. FileName, «», «», SW_SHOW);
str:= «»;
Size: =0;
for i: =0 to MainForm. FileList. Items. Count-1 do
begin
if MainForm. FileList. Selected[i] then
begin
FindFirst (MainForm. FileList. Items[i], faAnyFile, F);
Size: =Size+F. Size;
if MainForm. FileList. SelCount=1 then break;
end;
end;
// Оновлення статус строки
if MainForm. 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 TMainForm. 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;
procedure TMainForm. DirectoryMenuPopup (Sender: TObject);
// Визначення видимих компонент контектсного меню СД
begin
if MainForm. CMDirList. Items. Count=0 then
PasteDir. Enabled:=False
else
PasteDir. Enabled:=True;
If Length (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
// Визначити (щодо заповнення тимчасових списків) що необхідно вставить
// файли чи директории
if MainForm. TempCopyMove. Items. Count0 then
begin
ProgressForm. Show;
PasteFileFromTemp;
ProgressForm. Close;
end;
If MainForm. 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;
procedure TMainForm. 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
if MainForm. TempCopyMove. Items. Count0 then
begin
ProgressForm. Show;
PasteFileFromTemp;
ProgressForm. Close;
end;
If MainForm. 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. 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;
procedure MainForm. InvertSelectClick (Sender: TObject);
begin
ReselectAllFile;
end;
procedure TMainForm. FileListKeyUp (Sender: TObject; var Key: Word;
Shift: TShiftState);
// Клавіша відпущена під час роботи з СФ
Var
i: integer;
F: TSearchRec;
str: string;
begin
// Оновлення статус-строки
str:= «»;
Size: =0;
for i: =0 to MainForm. FileList. Items. Count-1 do
begin
if MainForm. FileList. Selected[i] then
begin
FindFirst (MainForm. FileList. Items[i], faAnyFile, F);
Size: =Size+F. Size;
if MainForm. FileList. SelCount=1 then break;
end;
end;
if MainForm. 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 TMainForm. 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;
Function FloatToInt (x: real):integer;
Procedure SaveIniMainForm;
Procedure ReadIniMainForm;
Procedure SetUpMainForm;
Procedure GetFormToCenter (Form: TForm);
Function FormatSize (S: String):String;
Procedure UpdateMC;
Procedure WriteIniOptions;
Procedure ReadIniOptions;
Procedure SetUpComponents;
Var
ColDeleteFiles, ColFilesIn_TempCopyMove: integer;
AllDeleteFlag, DeleteFlag: boolean;
ResultFDCFFlag: integer;
FDel: boolean;
Procedure CopyPathFileInTemp;
Function CreateStringForTemp (i: integer):string;
Procedure PasteFileFromTemp;
Function GetSizeAllFiles (List: TListBox):Integer;
Procedure DeleteEmptyDirectory (Dir: string);
Procedure CheckForOverwrite (Str: string;x:integer);
Var
Ddir: string;
DoingWithDir: boolean;
DirSourse: string;
Procedure GreateCopyMoveDirList (DirS: string);
Procedure CopyMoveDirectory;
implementation
Uses UMainForm, UOptionsForm, FMXUtils, UAskDeleteForm, UAskDeleteCurrentFile,
UDeleteDir;

Procedure CopyMoveDirectory;
//Копіювання перенесення директорий
begin
MainForm. CMDirList. Clear;
MainForm. CMFileList. Clear;
MainForm. CMDirList. Items. Add (MainForm. Directory. Directory);
//Створення тимчасових списков
GreateCopyMoveDirList (MainForm. Directory. Directory);
end;
Procedure GreateCopyMoveDirList (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;
Procedure CheckForOverwrite (Str: string;x:integer);
// Перевірка існування файлів і перезапис його за бажанню користувача при
вставке
Var
i: integer;
FilePaste: string;
FileinDir: string;
MStr: PChar;
begin
FilePaste: =ExtractFileName (Str);
for i: =0 to ColAllFiles-1 do
begin
Str: =MainForm. FileList. Items[i];
FileInDir: =Str;
if FilePaste=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;
Procedure DeleteEmptyDirectory (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;
if Fdel then
begin
MainForm. Directory. Delete (i);
RmDir (Dir);
end
Else
begin
MainForm. Directory. SetDirectory (Dir);
MainForm. Directory. BuildTree;
end;
end
Else MainForm. Directory. Delete (i);
{$I+}
MainForm. Directory. Update;
MainForm. CMDirList. Items. Clear;
MainForm. CMFileList. Items. Clear;
end;
Function GetSizeAllFiles (List: TListBox):Integer;
// Визначення розміру всіх файлів для прогрес формы
Var
i: integer;
Size: integer;
begin
Size: =0;
For i: =0 to List. Items. Count-1 do
begin
Size: =Size+GetFileSize (List. Items[i]);
end;
GetSizeAllFiles: =Size;
end;
Procedure PasteFileFromTemp;
//Вставка файлов
Var
StrPaste: string;
Str: string;
i: integer;
begin
//Формування параметрів для вставки файлов
If MainForm. Directory. Directory[Length (MainForm. Directory. Directory)] «» then
begin
StrPaste: =MainForm. Directory. Directory+ «»;
end
else
begin
StrPaste: =MainForm. Directory. Directory;
end;
//Перевірка всього списку вставляемых файлів на перезапись
For i: =0 to MainForm. TempCopyMove. Items. Count-1 do
CheckForOverwrite (MainForm. TempCopyMove. Items[i], i);
For i: =0 to MainForm. TempCopyMove. Items. Count-1 do
begin
Str: =MainForm. TempCopyMove. Items[i];
//Визначення дії над файлами копіювати чи перемещать
If FlagMoveFile 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;
If Str[Length (str)]= «* «then
begin
Str[Length (str)]: =#0;
MainForm. TempCopyMove. Items[i]:=Str;
end;
end;
MainForm. FileList. Update;
If FlagMoveFile then
begin
FlagMoveFile: =False;
MainForm. TempCopyMove. Clear;
end;
end;
Function CreateStringForTemp (i: integer):string;
//Створення рядки для тимчасового списка
Var
Str: string;
begin
Str: =MainForm. Directory. Directory;
If Str[Length (Str)] «» then
begin
Str: =Str+ «»;
end;
Str: =Str+MainForm. FileList. Items[i];
CreateStringForTemp: =Str;
end;
Procedure CopyPathFileInTemp;
//Створення тимчасового списку файлов
Var
i: integer;
begin
ColFilesIn_TempCopyMove: =0;
MainForm. TempCopyMove. Clear;
for i: =0 to ColAllFiles-1 do
begin
if MainForm. 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;
//Читання параметрів з іні файла
var tmpinteger: integer;
begin
with OptionsForm 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;
Procedure WriteIniOptions;
// Запис параметрів в іні файл
begin
with MCIni do
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
if OptionsForm. AskOnExit. Checked then AskExit: =True
else AskExit: =False;
If OptionsForm. CStatusBar. Checked then MainForm. StatusBar. Visible:=True
else MainForm. StatusBar. Visible:=False;
if OptionsForm. LFilelist. Caption=FL1 then
begin
MainForm. FileList. Columns:=1;
MainForm. FileList. Update;
end;
if OptionsForm. LFilelist. Caption=FL2 then
begin
MainForm. FileList. Columns:=2;
MainForm. FileList. Update;
end;
if OptionsForm. 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
with MainForm 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
if MainForm. 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;
Function FloatToInt (x: real):integer;
begin
FloatToInt: =StrToInt (FloatToStr (Int (X)));
end;
Procedure GetFormToCenter (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;
Function FormatSize (S: String):String;
// переклад цілого вересня читабельний формат (для розмірів файлів / директорий)
Var
i, j, n: integer;
Tmp, Temp: String;
begin
Tmp:= «»;
for i: =Length (S) downto 1 do
tmp: =tmp+S[i];
n: =0;
for i: =1 to Length (tmp) do
begin
if n=3 then
begin
n: =0;
Temp: =Temp+ », «;
end;
Temp: =Temp+Tmp[i];
n: =n+1;
end;
Tmp:= «»;
for i: =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;
Procedure DelOneFile (dFile: string;Flag:boolean);
Procedure DelNotEmptyDirectory (Dir: String);
Procedure PasteDirectory (SDir, DDir: string);
Procedure CreateDirInDestin (S, D: string);
Procedure SortCMDirList;
implementation
Uses
UMainForm, UMainForm_, UDeleteDir, DirOutLn, UAskDeleteCurrentFile,
FMXUtils, UProgressForm;
Procedure DelNotEmptyDirectory (Dir: string);
//Видалення пустопорожній директории
Var
i: integer;
Max: integer;
EndFor: integer;
begin
//Створення тимчасових списков
GreateCopyMoveDirList (dir);
//Видалення файлів із усіх поддиректорий
For i: =0 to MainForm. CMFileList. Items. Count-1 do
begin
DelOneFile (MainForm. CMFileList. Items[i], True);
FDeleteDir. Label1. Visible:=False;
FDeleteDir. LDir. Caption:= «File «+MainForm. CMFileList. Items[i]+ «is now
deleting »;
FdeleteDir. Update;
end;
//Сортування тимчасового списку директорій по возврастанию
SortCMDirList;
//Видалення вже порожніх директорий
For i: =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;
if IOResult0 then
begin
MainForm. CMDirList. Items. Clear;
MainForm. CMFileList. Items. Clear;
Exit;
end;
MainForm. CMDirList. Items. Delete (i);
end;
end;
Function DesideSlash (str: string):integer;
// Підрахунок кількості «» для сортировки
Var
D, r: integer;
begin
d: =0;
for r: =0 to Length (str) do
if str[r]= «» then d: =d+1;
DesideSlash: =D;
end;
Procedure SortCMDirList;
//Пузырьковая сортування списку директорий
Var i: integer;
Strl, StrH: string;
Flag: Boolean;
begin
Flag: =False;
if MainForm. CMDirList. Items. Count=0 then Flag: =true;
If MainForm. CMDirList. Items. Count1 then
repeat
For i: =0 to MainForm. CMDirList. Items. Count-2 do
begin
strl: =MainForm. CMDirList. Items[i];
StrH: =MainForm. CMDirList. Items[i+1];
if DesideSlash (StrL)> DesideSlash (StrH) then
begin
MainForm. CMDirList. Items[i]:=StrH;
MainForm. CMDirList. Items[i+1]:=StrL;
end;
end;
For i: =0 to MainForm. CMDirList. Items. Count-2 do
begin
if
DesideSlash (MainForm. CMDirList. Items[i])
then
begin
Flag: =True;
end
else
begin
Flag: =False;
Break;
end;
end;
Until (Flag);
end;
Procedure CreateOneDirInDes (d, s, str: string);
Var i, Point: integer;
begin
For i: =0 to Length (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;
if D[Length (D)]= «» then Point: =Point+1;
For i: =Point to Length (str) do
d: =d+str[i];
if not CreateDir (D) then
begin
end
else
begin
MainForm. Directory. SetDirectory (D);
MainForm. Directory. BuildTree;
end;
end;
Procedure CreateDirInDestin (S, D: string);
//Створення дерева директорій при копіюванні /переносе
Var
P, i, j: integer;str, str1: string;
EndFor: integer;
begin
MainForm. StatusBar. Panels[1]. Text:= «Build destination Tree, Please Wait… »;
SortCMDirList;
For i: =0 to MainForm. CMDirList. Items. Count-1 do
begin
str: =MainForm. CMDirList. Items[i];
CreateOneDirInDes (D, S, str);
end;
end;
Function CheskSizeInDestination: boolean;
// Перевірка доступного місця на диске
Var
i: integer;
Size: integer;
begin
For i: =0 to MainForm. CMFileList. Items. Count-1 do
size: =size+GetFileSize (MainForm. CMFileList. Items[i]);
if DiskFree (0) < size then>
CheskSizeInDestination: =False
else
CheskSizeInDestination: =True;
end;
Function CreateDestinPathForFile (S, D, f: string):string;
Var
Point, i: integer;
begin
For i: =0 to Length (s) do
if S[i]= «» then Point: =i;
if D[Length (d)]= «» then Point: =Point+1;
For i: =Point to Length (f) do
d: =d+f[i];
For i: =Length (d) downTo 0 do
if D[i]= «» then
begin
D[i+1]: =#0;
Break;
end;
CreateDestinPathForFile: =d;
end;
Procedure PasteFileInDest (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);
If not DoingWithDir then
DelOneFile (MainForm. CMFileList. Items[0], False);
MainForm. CMFileList. Items. Delete (0);
end;
ProgressForm. Close;
MainForm. FileList. Update;
end;
Procedure PasteDirectory (SDir, DDir: string);
//Вставка директории
Var
i: integer;
begin
if CheskSizeInDestination then
begin
CreateDirInDestin (SDir, DDir);
PasteFileInDest (Sdir, DDir);
if not DoingWithDir then
begin
end;
end
else
begin
if DoingWithDir then
begin
Application. MessageBox («Not Free Spase », «Error », MB_APPLMODAL+MB_OK);
end
else
begin
end;
end;
end;
Procedure DelOneFile (dFile: string;Flag:boolean);
//Видалення одного файла
Var
F: TSearchRec;
begin
if flag then
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;
procedure FormActivate (Sender: TObject);
procedure BitBtn1Click (Sender: TObject); /P>
procedure CBFindMaskDropDown (Sender: TObject);
procedure RBCurDirClick (Sender: TObject);
procedure RBCurDriveClick (Sender: TObject);
procedure RBAllDrivesClick (Sender: TObject);
procedure ExitSearchClick (Sender: TObject);
procedure CBAdvSearchClick (Sender: TObject);
procedure MenuPopup (Sender: TObject);
procedure Run1Click (Sender: TObject);
procedure GoTo1Click (Sender: TObject);
procedure B2Click (Sender: TObject);
procedure B1Click (Sender: TObject);
procedure Timer1Timer (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
private
public
Procedure FindInCurrentDir (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;
Procedure ZdvigMask (s: string);
Procedure InitFileMask;
Procedure WhereFind;
Procedure FindFile;
Procedure FindInAllDr;
function CompareFileWithMask (FileName: string):boolean;
implementation
uses UMainForm, FmxUtils;
{$R *. DFM}
function CompareFileWithMask (FileName: string):boolean;
//Порівняння імені Ілліча та розширення чергового файла з маской
Var
MaskN, Mask, MaskR, FN, FR: string;
EndFor, i, j: integer;
tmp, R: boolean;
begin
FN:= «»;
Mask: =FindForm. CBFindMask. Text;
if not FindForm. CBCase. Checked then
begin
Mask: =UpperCase (Mask);
FileName: =UpperCase (FileName);
end;
FR: =ExtractFileExt (FileName);
For i: =1 to Length (FileName) do
if FileName[i] «. «then
FN: =FN+FileName[i]
else break;
For i: =1 to Length (Mask) do
if Mask[i] «. «then
MaskN: =MaskN+Mask[i]
else break;
MaskR: =ExtractFileExt (Mask);
//початок мук з расширением
if Length (MaskR)< Length (FR) then>
EndFor: =Length (MaskR)
else
EndFor: =Length (FR);
if (MaskR[2]= «* ») and (FR «») then
begin
j: =Length (MaskR);
for i: =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;
If MaskR[Length (MaskR)]= «* «then
begin
j: =1;
for i: =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 to Length (MaskR) do
if MaskR[i] «* «then
tmp: =True
else
begin
tmp: =False;
break;
end;
if tmp then
if Length (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
if Length (MaskN)
EndFor: =Length (MaskN)
else EndFor: =Length (FN);
if MaskN[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;
if MaskN[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: =0 to Length (MaskN) do
if MaskN[i] «* «then
tmp: =True
else
begin
tmp: =False;
break;
end;
if tmp then
if Length (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
//Пошук в поточної директории
If FindForm. RBCurDir. Checked then
begin
Dir: =FindForm. LCurDir. Caption;
if Dir[Length (Dir)] «» then
Dir: =Dir+ «»;
FindForm. FindInCurrentDir (Dir);
end;
//Пошук на поточному диске
If FindForm. RBCurDrive. Checked then
begin
Dir: =FindForm. LCurDir. Caption;
if Dir[Length (Dir)] «» then
Dir: =Dir+ «»;
FindForm. FindInCurrentDir (Dir);
end;
//Пошук усім дисках
If FindForm. RBAllDrives. Checked then
begin
FindInAllDr;
end;
end;
Procedure TFindForm. 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
If FindForm. CBAdvSearch. Checked and (F. AttrfaDirectory) then
begin
if not (((F. Size < StrToInt (FindForm. SLess. Text)) and (F. Size >
StrToInt (FindForm. SGreater. Text)))) then Continue;
if not (((FileDateTime (CurDir+F. Name)
(FileDateTime (CurDir+F. Name) > FindForm. DateIsAfter. Date))) then Continue;
end;
if F. Attr=faDirectory then
if (F. Name «. ») and (F. Name ». ») then
begin
FindInCurrentDir (CurDir+F. Name+ «»);
end;
if (F. Name ». ») and (F. Name «. ») then
if CompareFileWithMask (F. Name) then
begin
FindForm. FileWasFind. Items. Add (CurDir+F. Name);
FindForm. StatusFind. Panels[0]. Text:=IntToStr (StrToInt (FindForm. StatusFind. Panels[0]. Text)+1);
FindForm. FileWasFind. Refresh;
end;
Until ((FindNext (F) 0));{ and (KeyPressed)); }
FindClose (F);
end;
Procedure FindInAllDr;
//Пошук усім дисках
Var
Dir: string;
i: integer;
begin
for i: =1 to MainForm. 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
if FindForm. RBCurDir. Checked then
begin
FindForm. LCurDir. Caption:=MainForm. Directory. Directory;
end;
if FindForm. RBCurDrive. Checked then
begin
FindForm. LCurDir. Caption:=UpperCase (MainForm. Directory. Drive)+ «: »;
end;
if FindForm. RBAllDrives. Checked then
begin
FindForm. LCurDir. Caption:= «»;
for i: =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;
for i: =1 to 10 do
begin
if FileMaskToFind[i] «» then
FindForm. CBFindMask. Items. Add (FileMaskToFind[i]);
end;
FindForm. CBFindMask. Text:=tempStr;
end;
Procedure ZdvigMask (s: string);
// Формування списку масок пошуку для хранения
Var
i: integer;
tmp: boolean;
begin
if FindForm. CBFindMask. Text «*.* «then
begin
for i: =10 downto 0 do
if FindForm. CBFindMask. Items[i]FindForm. CBFindMask. Text then
tmp: =true
else
begin
tmp: =False;
break;
end;
if tmp then
for i: =10 downto 2 do
begin
FileMaskToFind[i]: =FileMaskToFind[i-1];
end;
FileMaskToFind[1]: =s;
end;
end;
procedure TFindForm. 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;
procedure TFindForm. 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;
procedure TFindForm. CBFindMaskDropDown (Sender: TObject);
begin
InitFileMask;
end;
procedure TFindForm. RBCurDirClick (Sender: TObject);
begin
WhereFind;
end;
procedure TFindForm. RBCurDriveClick (Sender: TObject);
begin
WhereFind
end;
procedure TFindForm. RBAllDrivesClick (Sender: TObject);
begin
WhereFind;
end;
procedure TFindForm. ExitSearchClick (Sender: TObject);
begin
FindForm. Close;
end;
procedure TFindForm. CBAdvSearchClick (Sender: TObject);
begin
if CBAdvSearch. Checked then
begin
Table. ActivePage:= «Advanced Search »;
end;
end;
procedure TFindForm. MenuPopup (Sender: TObject);
var i: integer;
begin
for i: =0 to FindForm. FileWasFind. Items. Count-1 do
If FindForm. 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;
procedure TFindForm. Run1Click (Sender: TObject);
//Запуск файла з форми поиска
Var
i: integer;
begin
For i: =0 to FindForm. FileWasFind. Items. Count-1 do
if FindForm. 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 to FindForm. FileWasFind. Items. Count-1 do
begin
if FindForm. FileWasFind. Selected[i] then
begin
FileName: =ExtractFileName (FindForm. FileWasFind. Items[i]);
FindForm. Close;
Dir: =FindForm. FileWasFind. Items[i];
for j: =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;
for j: =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;
procedure TFindForm. GoTo1Click (Sender: TObject);
begin
GotoFile;
end;
procedure TFindForm. B2Click (Sender: TObject);
begin
GotoFile;
end;
procedure TFindForm. B1Click (Sender: TObject);
begin
Run1Click (Sender);
end;
procedure TFindForm. 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;
procedure TFindForm. 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 (const FileName, DestName: string);
procedure MoveFile (const FileName, DestName: string);
function GetFileSize (const FileName: string): LongInt;
function FileDateTime (const FileName: string): TDateTime;
function HasAttr (const FileName: string; Attr: Word): Boolean;
function ExecuteFile (const FileName, Params, DefaultDir: string;
ShowCmd: Integer): THandle;
{} Var AllReadByteFile: Real;
{} SizeAllCopy: Longint;
implementation
uses Forms, ShellAPI, UProgressForm, UMainForm_, UNotTrivial, UMainForm;
const
SInvalidDest = «Destination %p.s does not exist »;
SFCantMove = «Cannot move file %p.s »;
procedure CopyFile (const FileName, 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 < 0 then raise EFOpenError. CreateFmt (SFOpenError, [FileName]); >
try
Dest := FileCreate (Destination); { create output file; overwrite existing }
if Dest < 0 then raise EFCreateError. CreateFmt (SFCreateError, [Destination]); >
try
//Ведення статистики у вигляді прогресу копирования
{} If MainForm. 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 }
{} if ChunkSize> 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 < ChunkSize; { until we run out of chunks }>
{} 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 in FileName to the directory specified in DestDir.
Tries to just rename the file. If that fails, try to copy the file and
delete the original.
Raises an exception if the source file is read-only, and therefore cannot
be deleted/moved.
}
procedure MoveFile (const FileName, DestName: string);
var
Destination: string;
begin
Destination := ExpandFileName (DestName); { expand the destination path }
if not RenameFile (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 the named file without opening the file. If the file
doesn «t exist, returns -1.
}
function GetFileSize (const FileName: string): LongInt;
var
SearchRec: TSearchRec;
begin
if FindFirst (ExpandFileName (FileName), faAnyFile, SearchRec) = 0 then
Result := SearchRec. Size
else Result := -1;
end;
function FileDateTime (const FileName: string): System. TDateTime;
begin
Result := FileDateToDateTime (FileAge (FileName));
end;
function HasAttr (const FileName: string; Attr: Word): Boolean;
begin
Result := (FileGetAttr (FileName) and Attr) = Attr;
end;
function ExecuteFile (const FileName, 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.

Короткий керівництво пользователя.
Програма варта управління файловій системою ОС
Windows'95/'98, у програмі передбачені такі возможности:
Копіювання, перейменування, перенесення, видалення файлів і директорий;
Визначення й установка атрибутів файлов;
Розширений пошук файлів по маске;
Запуск програм зі рядком параметров;
Застосування маски-фильтра під час перегляду списку файлов;
Створення директорий;
Визначення розміру директории;
Визначення сумарного обсягу дискового простору займаного групою файлов;
Одержання інформації про поточному диске;
Запуск зовнішніх програм редакторів для перегляду і редагування файлов;
Установка интерфейсных параметрів программы.

Огляд інтерфейсу програми МС.
Інтерфейс програми чотирма функціональні части
Головне меню программы;
Панель инструментов;
Список файлов;
Список директорий;
Головне меню програми містить з три компоненти управління программой:
File
View
Options
Компонента File містить у собі основні функцій управління файлами і
директориями (див. рис. 1). Функція запуску програм Run доступна тільки тоді ми,
коли виділений файл є виконуваної програмою. При виборі даного
пункту. З’являється форма, яка містить рядок параметрів, і навіть параметр запуску
— вид форми вікна запуску (див. рис. 2).

Рис 1. Меню File.

Рис 2. Форма запуску файлів зі рядком параметров.
Функції Cut, Copy, Paste, Delete (Вирізати, Копіювати, Вставити, Видалити) —
стандартні функцій управління файлами/директориями. При неможливості
виконання названих вище дій, дані функції недоступні. Функція
Rename (Перейменувати) затребувана у користувача ім'я для файла /
директорії у вигляді показаної малюнку 3.

Рис 3. Перейменування файлів / директорий
Функція Delete (На вигнання), видаляє виділені елементи залежно від активної
робочої області. Якщо останнє, перед викликом цієї функції, виділення
вироблялося у сфері файлів, то будуть віддалені виділені файли, Якщо ж
активна область директорій то видалена буде директория.
Функція Find (Знайти) забезпечує розширений пошук файлів по масці у сфері
пошуку зазначеної користувачем. Параметри і маска пошуку поставив у формі
показаної малюнку 4

Рис 4. Пошук файлов.
Параметрами пошуку є завдання галузі пошуку, можливі три області:
поточна директорія, поточний диск і всі жорстких дисків (включаючи подключённые
мережні диски). Є також можливість розширеного пошуку із зазначенням
обмежень у дати створення файла створення та її гаданих розмірах. У
час пошуку рядку статусу форми відбивається кількість знайдених файлів,
директорія у якій здійснюється пошук. Коли знайшли файли,
може бути повернення у головну форму програми розвитку й перехід доречно становища
обраного файла, і навіть запуск даного файла (редагування в зовнішньому
редакторі, якщо обраний файл перестав бути додатком). Для зручності завдання
маски пошуку передбачене зберігання 10-и останніх масок у відчиненому списке.
Функція Exit (Вихід) виробляє вихід із программы.
Усім вище описаним функцій порівняно гарячі клавиши.
Компонента View містить у собі функції фільтра, отримання про диску,
здобуття влади та установка атрибутів файла, отримання розміру поточної директорії,
виділення всіх файлів що у поточної директорії і інверсне виділення
файлов.
Функція File Mask (Маско фільтра) затребувана у користувача у вигляді Get File
Mask маску для відображення файлів. Для скасування маски необхідний виклик
функції і завдання маски запропонованої по умолчанию.
Функція Info (Інформація) надає користувачеві інформацію про поточному диску
(обсяг вільного і зайнятого простору), і навіть інформацію про поточної
директории.
Функція File Attributes (Атрибути файла) дає можливість перегляду поточних
атрибутів файла та цих атрибутів. Що стосується кількох файлів можливо
групове присвоєння нових атрибутов.
Функція Size Directory (Розмір директорії) виводить до статусу рядку списку
директорій розмір поточної директории.
Функція Select All виділяє все файли, перебувають у даної директории.
Функція Invert Select інвертує виділення файлів. З файлів хто був
виділено, виділення знімається, інші ж файли выделяются.
Компонента Options (Параметри) виводить на екран форму параметрів програми див
рис 5, у якій користувач

Рис 5. Параметри программы
може встановити параметри інтерфейсу программы.
Параметри — наявність статус рядки, кількість колонок у списку файлів (від 1 до
3), вимагати підтвердження на виході з програми. Також існує
механізм установки значення параметрів за умовчанням (Вимагати підтвердження
коли, Наявність статус рядки, 1 колонка у списку файлов).
Панель інструментів містить у собі що з функцій розміщених у головному
меню, і навіть кнопка переходу врівень угору меча у списку директорій і список
дисків (включаючи мережні диски підключені операційній системою перед запуском
програми). Зовнішній вид панелі інструментів показаний малюнку 6.

Рис 6 Панель инструментов.
Список Файлів, призначений для перегляду списку файлів розміщених у поточної
директорії. При натисканні правої кнопки миші викликається контекстне меню, в
якому є функції копіювання, видалення, перейменування, вставки. У
списку файлів існує статус-строка у якій виводиться інформацію про
відзначеному файлі (ім'я, розмір, дату та палестинці час створення). Що стосується групи
відзначених файлів статус-строка показує який сумарний обсяг байт займають
відзначені файли на диску.
Список директорій, призначений для перегляду директорій що є на поточному
диску. Список має двевовидную структуру коренем якої являеться поточний диск.
При натисканні правої кнопки миші з’являтися контектсное меню у якому перераховані
функції роботи з директориями.
Використання функций:
Як згадувалося програма має набір функцій роботи з файлами. Деякі
потребують певній последоваьтельности дій розгляне даному
разделе.
Копіювання / Перенос.
Для копіювання файлів / директорії (надалі говорити про
файлах, оскільки процеси ідентичні) необхідні таку
послідовність действий:
Виділити файли які потрібно скопировать
Є кілька способів виділення групи файлів, (ті, хто добре знайомий в
операційній системою Windows'95 цей розділ, як всі наступні можуть
пропустити) виділення мишкою із застосуванням клавіш Ctrl і Shift, клавіша Ctrl
варта виділення у групу файлів окремо котрі стоять у списку, а клавіша
Shift варта виділення «від початкового файла, до конечного».
Виконати функцію копіювати у вигляді вибору її із будь-якої вище описаного
місця интерфейса
Вибрати місце призначення копіювання і функцію вставить.
Далі на екрані буде відбитий процес копіювання у вигляді Progress …
Удаление.
Видалення файлів відбувається з допомогою виклику функції видалення з частини
інтерфейсу. Після виклику, (видалити директорію) якщо директорія не
порожня, буде попросили потвержжение на видалення, (файл (ы)) буде попросили
потверждение видалення і приведён список удаляемых файлів, якщо удаляемый файл
має атрибути ReadOnly (лише читання) також попросили подтверждение.
Переименование.
При перейменування на екран виводитися форма, пропонує запровадити ім'я для
файла.


ПоказатьСвернуть
Заполнить форму текущей работой