(F. Size> StrToInt (FindForm.SGreater.Text)))) then Continue;
if not (((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
// компоненти 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 ]+':');
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.attr0) 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 0 then (if we read anything ... )
FileWrite (Dest, CopyBuffer ^, BytesCopied); (... write chunk)
() ProgressForm.ProgresCopy.Repaint;
() ProgressForm.AllProgresCopy.Repaint;
until BytesCopied () AllReadByteFile: = AllReadByteFile + GetFileSize (FileName);
() ProgressForm.Ready.Caption: = FormatSize (FloatToStr (AllReadByteFile));
() ProgressForm.AllProgresCopy.Progress: = FloatToInt (((100 * (AllReadByteFile)/(SizeAllCopy 1 ))));
() ProgressForm.ProgresCopy.Progress: = 100;
finally
FileClose (Dest); (close the destination file)
end;
finally
FileClose (Source); (close the source file)
end;
finally
FreeMem (CopyBuffer, ChunkSize); (free the buffer)
end;
end;
(MoveFile procedure)
(
Moves the file passed 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 (тільки для читання) також буде запрошено підтвердження.
Перейменування.
При перейменування на екран виводиться форма, що пропонує ввести нове ім'я для файлу.