Розробка файлової оболонки
Постановка завдання.
Завдання полягає в розробці файлової оболонки для операційної системи
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
(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
//Якщо знайдений файл - директорія, рекурсивний виклик пошуку в цiй
директорії
FindInCurrentDir (CurDir + F. Name +'');< br />
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
//Компоненти Plug-in (стандартні)
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
//Компоненти Plug-in (не стандартні)
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 ]+':');< br />
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 :='';< br />
//Визначення активних кнопок панелі управління
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 ...';< br />
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 +':';< br />
S: = MainForm.FileList.Mask;
MainForm.FileList.Mask :='>.>';< br />
FindFirst (MainForm.DrBox.Drive +':*.*', faDirectory, F);
Repeat
Until ((FindNext (F) 0) or ((F. Attr = faDirectory) and ((F. Name '.') Or
(F. Name'..'))));< br />
if F. AttrfaDirectory then
MainForm.Directory.SetDirectory (MainForm.DrBox.Drive +':')< br />
else
MainForm.Directory.SetDirectory (MainForm.DrBox.Drive +':'+ F. Name);
MainForm.Directory.BuildTree;
MainForm.Directory.SetDirectory (MainForm.DrBox.Drive +':');< br />
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 ('*');< br />
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 +':');< br />
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 +'';< br />
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 +'';< br />
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 ]:='';< br />
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 )));< br />
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 :='';< br />
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 +',';< br />
end;
Temp: = Temp + Tmp [i];
n: = n +1;
end;
Tmp :='';< br />
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 ....';< br />
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)
Ches