Файловый менеджер

Разработка файловового менеджера "FedorCommander" для работы под управлением операционной системы семейства Windows. Методы и принципы программной работы с файлами и папками. Технологии, методы, структуры, принципы положенные в основу алгоритма.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.06.2012
Размер файла 1007,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования Республики Беларусь

Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники»

Факультет компьютерных систем и сетей

Кафедра программного обеспечения информационных технологий

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе на тему

Файловый менеджер

Дисциплина

Основы алгоритмизации и программирование (ОАиП)

Студент гр. 151005

Федюкович С.А.

Руководитель

асс. Данилова Г.В.

Минск 2012г.

ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ

Проект1 - В Borland Delphi проектом называется совокупность файлов, создаваемых в процессе разработки программы.

Текущий путь2 - путь к каталогу с которым в данный момент работает пользователь.

ВВЕДЕНИЕ

При работе в любой операционной системе (ОС), в том числе и в Windows, возникает необходимость в манипуляции файлами. Пользователю всегда необходимо иметь возможность для копирования, перемещения, переименования, удаления и, конечно же, запуска файлов. Для осуществления этих, и других операций с файлами, применяются специальные программы - файловые менеджеры (также иногда называемые оболочками). При работе в ОС Windows 9x/NT/XP/Vista/7 можно пользоваться стандартной программой Explorer, которая практически интегрирована в Windows, а также можно применять файловые менеджеры сторонних разработчиков.

Существуют два основных типа файловых менеджеров:

a) Навигационные (пространственные) -- например Проводник в Windows.

б) Двупанельные -- например FAR, Total Commander.

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

А) Менеджеры Windows -- например Проводник (встроенный в Windows), FAR, Total Commander.

Б) Менеджеры Linux -- например Gnome Commander, Krusader.

В) Менеджеры Mac OS -- например Finder (встроенный) Disk Order.

Г) Кроссплатформенные (работающие в нескольких операционных системах) -- например JC, muCommander.

В курсовом проекте требовалось разработать файловый менеджер. Курсовой проект (получивший рабочее название FedorCommander) выполнен в Borland Delphi 7.

1. ПОСТАНОВКА ЗАДАЧИ

Разработать файловый менеджер для операционных систем семейства Microsoft Windows в котором реализованы базовые операции с файлами и папками:

а). Вывод списка файлов и каталогов;

б). Возможность перемещения по каталогам;

в). Возможность выбора диска для работы;

г). Запуск приложений;

д). Копирование, перемещение, переименование и удаление файлов и каталогов;

е). Создание новых каталогов.

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

2 ТЕХНОЛОГИИ, МЕТОДЫ, СТРУКТУРЫ, ПРИНЦИПЫ ПОЛОЖЕННЫЕ В ОСНОВУ АЛГОРИТМА

В Delphi существует понятие - подпрограммы управления файлами (category File management routines). Процедуры и функции входящие в эту категорию находятся в модулях System, SysUtils и FileCtrl. Также в программе будет использоваться модуль ShellAPI.

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

SysUtils function CreateDir(const Dir: string): Boolean; - Создание нового каталога;

SysUtils function DeleteFile(const FileName: string): Boolean; - Удаление файла;

SysUtils function FileExists(const FileName: string): Boolean; - Проверка наличия файла;

SysUtils function RemoveDir(const Dir: string): Boolean; - Удаление каталога;

SysUtils function RenameFile(const OldName, NewName: string): Boolean; - Переименование файла;

SysUtils function SetCurrentDir(const Dir: string): Boolean; - Установка текущего каталога;

ShellAPI ShellExecute( hwnd: THandle, lpOperation: PChar, lpFile: PChar, lpParameters: PСhar, lpDirectory: PChar, nShowCmd: integer ); - Запуск приложений.

Первоочередной задачей при разработке файлового менеджера является поиск файлов. Рассмотрим два основных вида поиска файлов.

а) Программный поиск файлов с помощью языка программирования object pascal (положенного в основу Delphi).

Delphi функции поиска:

FindFirst - Ищет первый файл;

FindNext - Продолжает поиск;

FindClose - Заканчивает поиск.

Вся организация цикла поиска сводится к:

Задание условий поиска. Это каталог и маска искомого элемента или элементов, атрибуты элемента(ов). При задании условий поиска сразу происходит поиск первого подходящего под условие элемента. Это функция FindFirst.

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

Закрытие поиска и освобождение памяти, выделяемой системой под поиск. Команда FindClose.

Функция FindFirst

Синтаксис:

FindFirst (КАТАЛОГ_ПОИСКА_И_МАСКА_ФАЙЛА,

АТРИБУТЫ_ИСКОМОГО_ФАЙЛА, ПОИСКОВОЯ_ПЕРЕМЕННАЯ);

где: Каталог для поиска и маска искомого элемента - строковая величина, имеющая тип String, может, например, содержать 'c:\*.*' - все элементы в корне диска С. Требуется помнить, что указывается полный путь для поиска.

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

faReadOnly - Файлы "только чтение".

faHidden - Скрытые файлы.

faSysFile - Системные файлы.

faVolumeID - Файл метки диска

faDirectory - Атрибут признака каталога.

faArchive - Обычный файл. По умолчанию устанавливается на заново создаваемых файлах.

faAnyFile - Если установить в качестве атрибута искомых элементов, то будет произведен поиск по всем вышесказанным атрибутам.

При поиске элементов имеющих атрибуты "каталог" и "скрытый" можно применить знак математического сложения, например

faDirectory + faHidden.

Поисковая переменная имеет тип TSearchRec. В нее, при успешном результате поиска, будет занесены все необходимые данные о найденном файловом элементе. Часть полей этой переменной предназначена пользователю (имя, атрибуты, размер и дата-время), а часть полей внутренние и используются самими функциями. Тип описан так:

TSearchRec = record

Time: Integer;

Size: Integer;

Attr: Integer;

Name: TFileName;

ExcludeAttr: Integer;

FindHandle: THandle;

FindData: TWin32FindData;

end;

Пользовательские поля:

($00) Time - время и дата последней модификации в DOS формате

($04) Size - размер в байтах младшие 4 байта (т.е. < 4Gb)

($08) Attr - атрибуты

($0C) Name - имя файла (длинное имя)

Внутренние поля:

($10) ExcludeAttr - атрибуты исключаемых файлов

($14) FindHandle - описатель (дескриптор) поиска

($18) FindData - данные возвращаемые Windows

Поскольку FindFirst является функцией, то она должна сама возвращать некоторое значение. Это значение имеет тип Integer и означает результат поиска файла (код ошибки поиска). Если файл найден, то принимает нулевое значение.

Функция FindNext

FindNext ( ПОИСКОВАЯ_ПЕРЕМЕННАЯ );

Эта функция продолжает поиск, заданный в функции FindFirst. Возвращает значение результата поиска.

Процедура FindClose

FindClose ( ПОИСКОВАЯ_ПЕРЕМЕННАЯ );

Закрывает поиск и освобождает память, выделенную системой под поиск.

б) Рассмотрим программный поиск файлов с помощью функций поиска Windows.

При создании программ для Windows более корректно применять стандартные функции этой системы. Для работы с ними не требуется создавать специальные переменные файлового типа: в системе Windows каждый файл имеет уникальный цифровой идентификатор (тип Integer). По-английски он называется Handle, и под таким названием присутствует в описании многих функций.

Windows функции поиска:

FindFirstFile - Ищет первый файл;

FindNextFile - Продолжает поиск;

FindClose - Заканчивает поиск.

function FindFirstFile(lpFileName: PChar; var lpFindFileData: TWIN32FindData): THandle;

Ищет первый файл или каталог, имя которого удовлетворяет указанному шаблону.

lpFileName - Шаблон, содержащий имя файла или каталога.

lpFindFileData - Указатель на буфер для приема результатов поиска. Имеет структуру:

TWIN32FindData = record

dwFileAttributes: DWORD;

ftCreationTime: TFileTime;

ftLastAccessTime: TFileTime;

ftLastWriteTime: TFileTime;

nFileSizeHigh: DWORD;

nFileSizeLow: DWORD;

dwReserved0: DWORD;

dwReserved1: DWORD;

cFileName: array[0..MAX_PATH - 1] of AnsiChar;

cAlternateFileName: array[0..13] of AnsiChar;

end;

Функция передает внутрь Windows шаблон и открывает описатель поиска, который с этого момента однозначно связан с шаблоном. Если функция находит файл, удовлетворяющий условиям шаблона, то она заполняет соответствующие поля буфера и возвращает описатель поиска. Поля заполняются следующим образом:

Смещение Имя Значение

$000 dwFileAttributes - атрибуты файла

$004 ftCreationTime - время создания

$00C ftLastAccessTime - время последнего доступа

$014 ftLastWriteTime - время последней модификации

$01C nFileSizeHigh - старшая часть длины файла, если >4Gb

$020 nFileSizeLow - младшая часть длины файла

$024 dwReserved0 - резерв

$028 dwReserved1 - резерв

$02C cFileName - длинное имя файла заканчивающееся пустым символом

$130 cAlternateFileName - псевдоним.

В случае неудачи буфер не заполняется и возвращается недействительный описатель (INVALID_HANDLE_VALUE = -1). Код ошибки можно узнать, вызвав GetLastError. Описатель поиска необходим для продолжения и закрытия поиска.

файл менеджер алгоритм

function FindNextFile(hFindFile: THandle; var lpFindFileData: TWIN32FindData): BOOL;

Продолжает поиск, начатый FindFirstFile используя ее шаблон для поиска.

hFindFileОписатель поиска, полученный от предварительно вызванной функции FindFirstFile.

lpFindFileData Указатель на буфер для приема результатов поиска.

Используя описатель поиска, полученный от FindFirstFile, функция FindNextFile продолжает поиск. Поиск проводится на основании раннее переданного внутрь Windows шаблона, который однозначно связан с описателем. Если функция находит файл, удовлетворяющий условиям шаблона, то она заполняет соответствующие поля буфера и возвращает True. В случае неудачи буфер не заполняется и возвращает False. Код ошибки можно узнать, вызвав GetLastError.

function FindClose(hFindFile: THandle): BOOL;

Заканчивает поиск начатый FindFirstFile.

hFindFile - Описатель поиска, полученный от первоначально вызванной функции FindFirstFile.

Уведомляет Windows о необходимости освободить ресурсы, которые были задействованы в проводимом поиске. В случае успеха возвращает True, иначе False. Код ошибки можно узнать, вызвав GetLastError. В любом случае дальнейшее использование описателя невозможно.

3 РАЗРАБОТКА СТРУКТУРЫ ПРОГРАММЫ

3.1 Структура программы

Файловый менеджер

А) Вывод списка файлов и каталогов;

1. Определить путь поиска

2. Поиск файлов и каталогов с помощью системы

3. Добавление найденных файлов и каталогов в компонент вывода файлов

Б) Перемещения по каталогам

1. Получить имя каталога

2. Поиск и вывод элементов запрашиваемого каталога

В) Выбор диска для работы;

1. Получить имя диска

2. Определить доступность диска

3. Поиск и вывод элементов запрашиваемого диска

Г) Открытие файлов;

1. Получить имя файла

2. Запросить файл у системы

3. Отобразить содержимое файла

Д) Копирование файлов и каталогов;

1. Получить имя файла/каталога

2. Получить путь для копирования

3. Отправить запрос на копирование системе

4. Обновить список файлов и каталогов

Е) Перемещение файлов и каталогов

1. Получить имя файла/каталога

2. Получить путь для перемещения

3. Отправить запрос на перемещение системе

4. Обновить списки файлов и каталогов

Ж) Переименование файлов и каталогов

1. Получить имя файла/каталога

2. Получить новое имя файла/каталога

3. Отправить запрос на переименование системе

4. Обновить список файлов и каталогов

З) Удаление файлов и каталогов

1. Получить имя файла/каталога

2. Отправить запрос на удаление системе

3. Обновить список файлов и каталогов

И)Создание новых каталогов.

1. Получить имя нового каталога

2. Получить путь для создания каталога

3. Отправить запрос на создание каталога системе

4. Обновить список файлов и каталогов

3.2 Схема работа программы

Рисунок 3.1 - Схема работы программы

Программное описание процедур находятся в Приложении.

3.3 Схема алгоритма №1

Присваивание компонентам вывода файлов списка маленьких и больших системных иконок.

Рисунок 3.2 - Схема присваивания иконок

Описание алгоритма приведено в пункте «разработка программы».

3.4 Схема алгоритма №2

Запуск выделенного элемента

Рисунок 3.2 - Схема запуска элемента

Описание алгоритма приведено в пункте «разработка программы».

3.5 Состав проекта

Проект1 FedorCommander состоит, помимо файлов, создаваемых системой программирования автоматически, из трёх модулей (MainUnit, UnitAdd и Unit1).

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

Во втором модуле (UnitAdd) находится описание и функции обработчики событий для формы (FormDir), являющейся диалоговым окном создания новой директории.

В третьем модуле (Unit1) находится описание для формы (FormAbout), являющейся окном сведений о программе.

4. РАЗРАБОТКА ПРОГРАММЫ

4.1 Разработка процедуры TMainForm.FormCreate

Разработка процедуры присваивания компонентам вывода файлов списка маленьких и больших системных иконок.(Схема алгоритма №1)

Для работы этой процедуры понадобиться модуль shellapi, поэтому запишем его в раздел uses. Листинг процедуры находится в Приложении. Процедура будет описываться в обработчике события OnCreate.

В первых четырёх строках создаются списки маленьких и больших иконок для двух компонентов вывода файлов(lvLeft, lvRight):

lvLeft.LargeImages:=TImageList.Create(self);

lvLeft.SmallImages:=TImageList.Create(self);

lvRight.LargeImages:=TImageList.Create(self);

lvRight.SmallImages:=TImageList.Create(self);

Потом запрашиваем у системы список больших иконок. Для этого используется функция SHGetFileInfo, которая возвращает информацию о файле, папке или диске. Функция имеет пять параметров:

А.Путь к файлу;

Б. Атрибуты;

В. Указатель на TSHFileInfo;

Г. Размер TSHFileInfo;

Д. Флаги, указывающие на тип информации, запрашиваемой у системы.

В нашем примере первые два параметра пустые, это показывает, что нужна системная информация. Третий параметр - переменная SFI описанная в разделе var процедуры. В качестве флагов указывается SHGFI_SYSICONINDEX и SHGFI_LARGEICON. SHGFI_SYSICONINDEX означает, что нужно вернуть указатель на системный список иконок. SHGFI_LARGEICON означает, что нужны большие иконки.

Пример: SysImageList:=SHGetFileInfo('', 0, SFI, SizeOf(TSHFileInfo),

SHGFI_SYSICONINDEX or SHGFI_LARGEICON);

Если указатель на большие системные иконки получен, то присваиваем его списку картинок lvLeft и lvRight:

if SysImageList <> 0 then

begin

lvLeft.LargeImages.Handle:=SysImageList;

lvLeft.LargeImages.ShareImages:= True;

lvRight.LargeImages.Handle:=SysImageList;

lvRight.LargeImages.ShareImages:= True;

end;

При втором вызове функции SHGetFileInfo запрашиваем маленькие иконки(SHGFI_SMALLICON):

SysImageList:=SHGetFileInfo('', 0, SFI, SizeOf(TSHFileInfo),

SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

Аналогично присваиваем компонентам вывода маленькие иконки:

if SysImageList <> 0 then

begin

lvLeft.SmallImages.Handle:= SysImageList;

lvLeft.SmallImages.ShareImages:=True;

lvRight.SmallImages.Handle:= SysImageList;

lvRight.SmallImages.ShareImages:=True

end;

Системный список иконок содержит все иконки, установленные в системе и ассоциированные с разными типами файлов.

4.2 Разработка процедуры OpenElem

Разработка процедуры запуска выделенного элемента

(Схема алгоритма №2)

Листинг процедуры находится в Приложении. В листинге процедура будет иметь имя procedure OpenElem.

Процедура имеет три параметра:

А. lv: TListViem - компонент вывода файлов(lvLeft или lvRight);

Б. Curr_Dir: string - Текущий путь2 ;

В. Edit: TEdit - компонент отображения текущего пути2 (EditLeft или EditRight);

Пример:

procedure OpenElem(lv: TListView; var Curr_Dir: string; Edit: TEdit);

В первой строке кода осуществляется проверка произведенного выбора (по какому объекту был произведен щелчок мышью). Для этого проверяется нулевой дополнительный параметр выделенного элемента:

if (lv.Selected.SubItems[0]='[Папка]')

А. Если выделенный элемент папка, то осуществим проверку: является ли она родительским каталогом:

if lv.Selected.Caption='..'

1)Then - Если это родительский каталог, то удалим из строки текущего пути имя папки в которой ведётся работа.

Определим количество символов в имени активной папки (символы до знака «\») и удалим их используя процедуру Delete.

Пример:

i:=1;

len:=Length(Curr_Dir);

while Curr_Dir[len-i] <> '\' do Inc(i);

Delete(Curr_Dir, len-i, i);

2). Если это не родительский каталог, то добавим к текщему пути имя выделенной папки:

Curr_Dir:=Curr_Dir + lv.Selected.Caption + '\';

После определения нового текущего пути, отобразим элементы этой папки и выведем текущий путь на основную форму:

LoadFileList(lv, Curr_Dir);

Edit.Text:= Curr_Dir;

Б. В случае с файлом используем функцию ShellExecute. Данная функция имеет шесть параметров:

1) Программа, отвечающая за запуск приложения. (Укажем главное окно программы Application.MainForm.Handle);

2) Строка, указывающая на операцию, которую надо выполнить. (Укажем nil для запуска файла);

3) Строка, содержащая путь к файлу (Укажем Текущий путь + имя выделенного элемета: Curr_Dir + lv.Selected.Caption);

4) Строка параметров, передаваемых программе в командной строке;

5) Папка по умолчанию (Укажем Текущий путь: Curr_Dir);

6) Команда показа. (Укажем SW_SHOW для нормального отображения окна.

Пример: ShellExecute(Application.MainForm.Handle, nil, PChar(Curr_Dir + lv.Selected.Caption), '', PChar(Curr_Dir), SW_SHOW);

5. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Файловый менеджер FedorCommander - это программа, позволяющая выполнять навигацию по файловой системе, перемещать файлы и другие объекты, запускать исполняемые файлы и выполнять друние действия над файлами и папками средствами Графического пользовательского интерфейса.

Для запуска программы дважды щелкните мышью по пиктограмме файла FedorCommander.

Рисунок 1 - Главное окно программы

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

А. F7 - Создать папку

Б. F5 - Копировать

В. F6 - Переместить

Г. F9 - Переименовать

Д. F8 - Удалить

Е. Alt+F4 - Выход из программы

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

Запуск файлов и открытие каталогов осуществляется двойным щелчком мыши по элементу в списке содержащем файлы и каталоги.

Остальные свойства программы достаточно очевидны и традиционны для графического пользовательского интерфейса.

ЗАКЛЮЧЕНИЕ

Результатом выполнения курсовой работы явился простейший файловый менеджер «FedorCommander» предназначенный для работы под управлением операционной системы семейства Windows. Написанная программа реализует базовые функции работы с файлами и каталогами, такие как:

А. Вывод списка файлов и каталогов;

Б. Возможность перемещения по каталогам;

В. Возможность выбора диска для работы;

Г. Запуск приложений;

Д. Копирование, перемещение, переименование и удаление файлов и каталогов;

Е.Создание новых каталогов.

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

а. Просмотр различных типов документов внутри рабочего окна приложения;

б. Проигрыватель аудио и видео информации;

в. Возможность работы с сетевыми дисками;

г. Отображение списка системных процессов;

д. Редактра реестра;

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

А. Delphi 7: Наиболее полное руководство / А.Д. Хомоненко [и др.]. - Санкт-Петербург: БХВ-ПЕТЕРБУРГ, 2008. - 1216с.

Б. Флёнов, М.Е. Библия Delphi: 3-е издание / М.Е. Флёнов. -

Санкт-Петербург: БХВ-ПЕТЕРБУРГ, 2011. - 688с.

В. Глухова, Л.А. Основы алгоритмизации и программирования: учеб. Пособие / Л.А. Глухова - Минск: БГУИР, 2006. - 195с.

Г. Культин, Н.Б. Основы программирования в Delphi 7 /

Культин Н.Б. - Санкт-Петербург: БХВ-ПЕТЕРБУРГ, 2005. - 336с.

Д. Справка Delphi 7.

Е. Занкович, А.П. Структуры и алгоритмы обработки данных: конспект лекций / А.П. Занкович, И.М. Марина, Л.В. Бочкарёва - Минск: БГУИР, 2008. - 87с.

Ж. Смирнов, С.И. Уроки программирования: Pascal - Delphi / С.И. Смирнов - Красноярск: Красноярск, 2011. - 150с.

З. Бакнелл, Д. Фундаментальные алгоритмы и структуры данных в Delphi / Д. Бакнелл - Санкт-Петербург: ДиаСофтЮП, 2003. - 560с.

И. http://articles.org.ru/docum/filefunc.php - «Работа с файлами»

К. http://professionalprograms.ru/?p=36 - «Отыскивание файлов на Delphi»

ПРИЛОЖЕНИЕ A

unit MainUnit;

interface

uses

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

Dialogs, ComCtrls, StdCtrls, FileCtrl, ShellAPI, Menus, XPMan, ToolWin,

ExtCtrls, ImgList, DateUtils;

type

TMainForm = class(TForm)

lvLeft: TListView;

drvcbbLeft: TDriveComboBox;

EditLeft: TEdit;

lvRight: TListView;

drvcbbRight: TDriveComboBox;

EditRight: TEdit;

mmenu: TMainMenu;

mniFail: TMenuItem;

mniAboutProgr: TMenuItem;

mniNewDir: TMenuItem;

mniExit: TMenuItem;

N1: TMenuItem;

mniCopyElem: TMenuItem;

mniDelete: TMenuItem;

mniMoveTo: TMenuItem;

mniReName: TMenuItem;

ControlBar1: TControlBar;

ToolBar1: TToolBar;

btnCreateDir: TToolButton;

btnCopy: TToolButton;

btnDelete: TToolButton;

btnMoveTo: TToolButton;

btnReName: TToolButton;

btnSepar: TToolButton;

btnExit: TToolButton;

ImageList1: TImageList;

lblDateAndTime: TLabel;

tmrTime: TTimer;

btnPowerOff: TToolButton;

TLSepar2: TToolButton;

procedure drvcbbLeftChange(Sender: TObject);

procedure lvLeftKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure drvcbbRightChange(Sender: TObject);

procedure lvRightKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure FormCreate(Sender: TObject);

procedure lvLeftDblClick(Sender: TObject);

procedure lvRightDblClick(Sender: TObject);

procedure mniNewDirClick(Sender: TObject);

procedure lvLeftClick(Sender: TObject);

procedure lvRightClick(Sender: TObject);

procedure mniDeleteClick(Sender: TObject);

procedure mniCopyElemClick(Sender: TObject);

procedure mniExitClick(Sender: TObject);

procedure mniAboutProgrClick(Sender: TObject);

procedure mniReNameClick(Sender: TObject);

procedure mniMoveToClick(Sender: TObject);

procedure lvLeftColumnClick(Sender: TObject; Column: TListColumn);

procedure lvRightColumnClick(Sender: TObject; Column: TListColumn);

procedure tmrTimeTimer(Sender: TObject);

procedure btnPowerOffClick(Sender: TObject);

private

public

end;

var

MainForm: TMainForm;

Curr_DirL, Curr_DirR: string;

Sort: Integer = 1;

procedure LoadFileList(lv: TListView; const dir: string);

implementation

uses Unit1, UnitAdd;

Function DiskInDrive(ADriveLetter : Char) : Boolean;

var

SectorsPerCluster,

BytesPerSector,

NumberOfFreeClusters,

TotalNumberOfClusters : Cardinal;

begin

Result := GetDiskFreeSpace(PChar(ADriveLetter+':\'),

SectorsPerCluster,

BytesPerSector,

NumberOfFreeClusters,

TotalNumberOfClusters);

end;

procedure LoadFileList(lv: TListView; const dir: string);

var

Handle: THandle;

ShInfo: TSHFileInfo;

FindData: TWin32FindData;

dDir, temp_ext: string;

lft: TFileTime;

dft: DWORD;

dt: TDateTime;

begin

dDir:=IncludeTrailingPathDelimiter(dir);

SetCurrentDir(dDir);

lv.Items.BeginUpdate;

lv.Clear;

Handle:=FindFirstFile(PChar(dDir+'*'), FindData);

if Handle <> Invalid_Handle_Value then

try

while FindNextFile(Handle, FindData) do

begin

SHGetFileInfo(PChar(dDir+FindData.cFileName), 0, ShInfo, SizeOf(ShInfo), SHGFI_TYPENAME or SHGFI_SYSICONINDEX);

if (FindData.dwFileAttributes and faHidden) = faHidden then

Continue;

with lv.Items.Add do

begin

Caption:=ExtractFileName(FindData.cFileName);

ImageIndex := ShInfo.iIcon;

temp_ext:=ExtractFileExt(FindData.cFileName);

if (FindData.dwFileAttributes and faDirectory) = faDirectory

then

SubItems.Add('[Папка]')

else

SubItems.Add(Copy(temp_ext, 2, Length(temp_ext) - 1));

SubItems.Add(FloatToStrF(FindData.nFileSizeHigh*4294967296 + FindData.nFileSizeLow, ffGeneral, 18, 0));

FileTimeToLocalFileTime(FindData.ftLastWriteTime, lft);

FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo);

dt:=FileDateToDateTime(dft);

SubItems.Add(DateTimeToStr(dt));

end;

end;

finally

Windows.FindClose(Handle);

end;

lv.Items.EndUpdate;

end;

procedure OpenElem(lv: TListView; var Curr_Dir: string; Edit: TEdit);

var

len, i: Integer;

begin

if (lv.Selected.SubItems[0]='[Папка]') then

begin

if lv.Selected.Caption='..' then

begin

i:=1;

len:=Length(Curr_Dir);

while Curr_Dir[len-i] <> '\' do Inc(i);

Delete(Curr_Dir, len-i, i);

end

else

Curr_Dir:=Curr_Dir + lv.Selected.Caption + '\';

LoadFileList(lv, Curr_Dir);

Edit.Text:= Curr_Dir;

end

else

ShellExecute(Application.MainForm.Handle, nil, PChar(Curr_Dir + lv.Selected.Caption), '', PChar(Curr_Dir), SW_SHOW);

end;

procedure RemoveAll(path: string);

var

sr: TSearchRec;

begin

if FindFirst(path + '\*.*', faAnyFile, sr) = 0 then

begin

repeat

if sr.Attr and faDirectory = 0 then

DeleteFile(path+'\'+sr.Name)

else

if Pos('.', sr.Name) <=0 then

RemoveAll(path+'\'+sr.Name);

until FindNext(sr) <> 0 ;

FindClose(sr);

RemoveDirectory(PChar(path))

end;

end;

procedure CopyDir(sourcepath, targetpath: string);

var

sr: TSearchRec;

ScanDir, KonDir: string;

ISearch: Integer;

begin

try

ScanDir:=sourcepath;

KonDir:=targetpath;

ScanDir:=IncludeTrailingBackslash(ScanDir);

ISearch:=FindFirst(ScanDir+'*.*', faAnyFile, sr);

while ISearch=0 do

begin

if (sr.Name<>'') and (sr.Name<>'.') and (sr.Name<>'..') then

begin

KonDir:=IncludeTrailingBackslash(KonDir);

ScanDir:=IncludeTrailingBackslash(ScanDir);

if ((sr.Attr and FaDirectory) = faDirectory) then

begin

if not DirectoryExists(KonDir+sr.Name) then

CreateDir(KonDir+sr.Name);

CopyDir(ScanDir+sr.Name, KonDir+sr.Name);

end

else

CopyFile(PChar(ScanDir+sr.Name), PChar(KonDir+sr.Name), False);

end;

ISearch:=FindNext(sr)

end;

FindClose(sr);

except

ShowMessage('Ошибка...')

end

end;

function SortCaptionAsString(Item1, Item2: TListItem;

ParamSort: Integer):Integer; stdcall;

begin

Result:=0;

if AnsiUpperCase(Item1.Caption) > AnsiUpperCase(Item2.Caption) then

Result:= ParamSort

else

if AnsiUpperCase(Item1.Caption) < AnsiUpperCase(Item2.Caption) then

Result:= - ParamSort;

end;

function SortFirstSubItemAsString(Item1, Item2: TListItem;

ParamSort: Integer): Integer; stdcall;

begin

Result:= 0;

if AnsiUpperCase(Item1.SubItems[0]) > AnsiUpperCase(Item2.SubItems[0]) then

Result:= ParamSort

else

if AnsiUpperCase(Item1.SubItems[0]) < AnsiUpperCase(Item2.SubItems[0]) then

Result:= - ParamSort;

end;

function SortSecondSubItemAsInteger(Item1, Item2: TListItem;

ParamSort: Integer): integer; stdcall;

begin

Result:= 0;

if StrToFloat(Item1.SubItems[1])>StrToFloat(Item2.SubItems[1]) then

Result:= ParamSort

else

if StrToFloat(Item1.SubItems[1]) < StrToFloat(Item2.SubItems[1]) then

Result:= - ParamSort;

end;

function SortThirdSubItemAsDate( Item1, Item2: TListItem;

ParamSort: Integer): Integer; stdcall;

begin

Result:=0;

if StrToDateTime(Item1.SubItems[2]) > StrToDateTime(Item2.SubItems[2]) then

Result:= ParamSort

else

if StrToDateTime(Item1.SubItems[2]) < StrToDateTime(Item2.SubItems[2]) then

Result:= - ParamSort;

end;

{$R *.dfm}

procedure TMainForm.drvcbbLeftChange(Sender: TObject);

begin

if not DiskInDrive(drvcbbLeft.Drive) then

begin

ShowMessage('Диск не найден');

Exit

end;

LoadFileList(lvLeft, drvcbbLeft.Drive+':');

Curr_DirL:=drvcbbLeft.Drive + ':\';

lvLeft.SetFocus;

if lvLeft.Items.Count <> 0 then

lvLeft.ItemIndex:=0;

EditLeft.Text:=drvcbbLeft.drive+':'+'\';

end;

procedure TMainForm.lvLeftKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (Key = 13) and (lvLeft.Selected <> nil) then

OpenElem(lvLeft, Curr_DirL, EditLeft);

end;

procedure TMainForm.drvcbbRightChange(Sender: TObject);

begin

if not DiskInDrive(drvcbbRight.Drive) then

begin

ShowMessage('Диск не найден');

Exit

end;

LoadFileList(lvRight, drvcbbRight.Drive+':');

Curr_DirR:=drvcbbRight.Drive + ':\';

lvRight.SetFocus;

if lvRight.Items.Count <> 0 then

lvRight.ItemIndex:=0;

EditRight.Text:=drvcbbRight.drive+':'+'\';

end;

procedure TMainForm.lvRightKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (Key=13) and (lvRight.Selected<>nil) then

OpenElem(lvRight, Curr_DirR, EditRight);

end;

procedure TMainForm.FormCreate(Sender: TObject);

var

SysImageList: uint; SFI: TSHFileInfo;

begin

lvLeft.LargeImages:=TImageList.Create(self);

lvLeft.SmallImages:=TImageList.Create(self);

lvRight.LargeImages:=TImageList.Create(self);

lvRight.SmallImages:=TImageList.Create(self);

SysImageList:=SHGetFileInfo('', 0, SFI, SizeOf(TSHFileInfo),

SHGFI_SYSICONINDEX or SHGFI_LARGEICON);

if SysImageList <> 0 then

begin

lvLeft.LargeImages.Handle:=SysImageList;

lvLeft.LargeImages.ShareImages:= True;

lvRight.LargeImages.Handle:=SysImageList;

lvRight.LargeImages.ShareImages:= True;

end;

SysImageList:=SHGetFileInfo('', 0, SFI, SizeOf(TSHFileInfo),

SHGFI_SYSICONINDEX or SHGFI_SMALLICON);

if SysImageList <> 0 then

begin

lvLeft.SmallImages.Handle:= SysImageList;

lvLeft.SmallImages.ShareImages:=True;

lvRight.SmallImages.Handle:= SysImageList;

lvRight.SmallImages.ShareImages:=True

end;

end;

procedure TMainForm.lvLeftDblClick(Sender: TObject);

begin

if lvLeft.Selected<>nil then

OpenElem(lvLeft, Curr_DirL, EditLeft);

end;

procedure TMainForm.lvRightDblClick(Sender: TObject);

begin

if lvRight.Selected<>nil then

OpenElem(lvRight, Curr_DirR, EditRight);

end;

procedure TMainForm.mniNewDirClick(Sender: TObject);

begin

FormDir.ShowModal;

end;

procedure TMainForm.lvLeftClick(Sender: TObject);

begin

lvRight.Selected:=nil;

end;

procedure TMainForm.lvRightClick(Sender: TObject);

begin

lvLeft.Selected:=nil;

end;

procedure TMainForm.mniDeleteClick(Sender: TObject);

begin

if (lvLeft.Selected = nil) and (lvRight.Selected = nil) then

begin

ShowMessage(`Выберите элемент для удаления...');

Exit

end;

if MessageDlg('Вы уверены?', mtInformation, [mbOK, mbCancel], 0)=mrOk then

begin

if lvLeft.Selected<>nil then

begin

if lvLeft.Selected.SubItems[0]<>'[Папка]' then

DeleteFile(Curr_DirL+lvLeft.Selected.Caption)

else

begin

if Pos(Curr_DirL+lvLeft.Selected.Caption, Curr_DirR) <> 0 then

begin

LoadFileList(lvRight, drvcbbRight.Drive + ':');

Curr_DirR:=drvcbbRight.Drive+':\';

end;

RemoveAll(PChar(Curr_DirL+lvLeft.Selected.Caption));

end;

LoadFileList(lvLeft, Curr_DirL);

if Curr_DirL = Curr_DirR then

LoadFileList(lvRight, Curr_DirR)

end

else

begin

if lvRight.Selected.SubItems[0]<>'[Папка]' then

DeleteFile(Curr_DirR+lvRight.Selected.Caption)

else

begin

if Pos(Curr_DirR+lvRight.Selected.Caption, Curr_DirL) <> 0 then

begin

LoadFileList(lvLeft, drvcbbLeft.Drive + ':');

Curr_DirL:=drvcbbLeft.Drive+':\';

end;

RemoveAll(PChar(Curr_DirR+lvRight.Selected.Caption));

end;

LoadFileList(lvRight, Curr_DirR);

if Curr_DirR = Curr_DirL then

LoadFileList(lvLeft, Curr_DirL);

end;

end;

end;

procedure TMainForm.mniCopyElemClick(Sender: TObject);

var

kyda: string;

begin

if (lvLeft.Selected = nil) and (lvRight.Selected = nil) then

begin

ShowMessage(`Выберите элемент для копирования...');

Exit

end;

if lvLeft.Selected <> nil then

begin

kyda:=Curr_DirR+lvLeft.Selected.Caption;

if not InputQuery('Крпирование', 'Куда копируем?', kyda) then

Exit;

if lvLeft.Selected.SubItems[0] = '[Папка]' then

begin

ForceDirectories(kyda);

CopyDir(Curr_DirL + lvLeft.Selected.Caption, kyda)

end

else

if not CopyFile(PChar(Curr_DirL + lvLeft.Selected.Caption),

PChar(kyda), false) then

ShowMessage('Ошибка копирования');

end

else

begin

kyda:= Curr_DirL+lvRight.Selected.Caption;

if not InputQuery('Копирование', 'Куда копируем?', kyda) then

Exit;

if lvRight.Selected.SubItems[0] = '[Папка]' then

begin

ForceDirectories(kyda);

CopyDir(Curr_DirR + lvRight.Selected.Caption, kyda)

end

else

if not CopyFile(PChar(Curr_DirR + lvRight.Selected.Caption),

PChar(kyda), false) then

ShowMessage('Ошибка копирования');

end;

LoadFileList(lvLeft, Curr_DirL);

LoadFileList(lvRight, Curr_DirR);

end;

procedure TMainForm.mniExitClick(Sender: TObject);

begin

Close;

end;

procedure TMainForm.mniAboutProgrClick(Sender: TObject);

begin

FormAbout.ShowModal;

end;

procedure TMainForm.mniReNameClick(Sender: TObject);

var

newName: string;

begin

if (lvLeft.Selected = nil) and (lvRight.Selected = nil) then

begin

ShowMessage(Выберите элемент для переименования...');

Exit

end;

if lvLeft.Selected <> nil then

begin

newName:=Curr_DirL + InputBox('Переименование', 'Новое имя',

lvLeft.Selected.Caption);

if newName<>Curr_DirL then

RenameFile(Curr_DirL+lvLeft.Selected.Caption, newName)

else

ShowMessage('Не введено новое имя');

LoadFileList(lvLeft, Curr_DirL);

end

else

begin

newName:=Curr_DirR + InputBox('Переименование', 'Новое имя',

lvRight.Selected.Caption);

if newName<>Curr_DirR then

RenameFile(Curr_DirR+lvRight.Selected.Caption, newName)

else

ShowMessage('Не введено новое имя');

LoadFileList(lvRight, Curr_DirR);

end;

end;

procedure TMainForm.mniMoveToClick(Sender: TObject);

var

kyda: string;

begin

if (lvLeft.Selected = nil) and (lvRight.Selected = nil) then

begin

ShowMessage('Выберите элемент для перемещения...');

Exit

end;

if lvLeft.Selected <> nil then

begin

kyda:= Curr_DirR+lvLeft.Selected.Caption;

if InputQuery('Перемещение', 'Куда перемещаем?', kyda) then

if not MoveFile(PChar(Curr_DirL + lvLeft.Selected.Caption),

PChar(kyda)) then

ShowMessage('Ошибка перемещения');

end

else

begin

kyda:= Curr_DirL+lvRight.Selected.Caption;

if InputQuery('Перемещение', 'Куда перемещаем?', kyda) then

if not MoveFile(PChar(Curr_DirR + lvRight.Selected.Caption),

PChar(kyda)) then

ShowMessage('Ошибка перемещения');

end;

LoadFileList(lvLeft, Curr_DirL);

LoadFileList(lvRight, Curr_DirR);

end;

procedure TMainForm.lvLeftColumnClick(Sender: TObject;

Column: TListColumn);

begin

Sort:=-Sort;

if Column = lvLeft.Columns[0] then

lvLeft.CustomSort( @SortCaptionAsString, Sort);

if Column = lvLeft.Columns[1] then

lvLeft.CustomSort( @SortFirstSubItemAsString, Sort);

if Column = lvLeft.Columns[2] then

lvLeft.CustomSort( @SortSecondSubItemAsInteger, Sort);

if Column = lvLeft.Columns[3] then

lvLeft.CustomSort( @SortThirdSubItemAsDate, Sort);

end;

procedure TMainForm.lvRightColumnClick(Sender: TObject;

Column: TListColumn);

begin

Sort:=-Sort;

if Column = lvRight.Columns[0] then

lvRight.CustomSort( @SortCaptionAsString, Sort);

if Column = lvRight.Columns[1] then

lvRight.CustomSort( @SortFirstSubItemAsString, Sort);

if Column = lvRight.Columns[2] then

lvRight.CustomSort( @SortSecondSubItemAsInteger, Sort);

if Column = lvRight.Columns[3] then

lvRight.CustomSort( @SortThirdSubItemAsDate, Sort);

end;

procedure TMainForm.tmrTimeTimer(Sender: TObject);

function DayOfWeek_(): string;

var

x: Byte;

begin

x:=DayOfWeek(Date);

case x of

1: Result:='Воскресенье';

2: Result:='Понедельник';

3: Result:='Вторник';

4: Result:='Среда';

5: Result:='Четверг';

6: Result:='Пятница';

7: Result:='Суббота';

end;

end;

begin

lblDateAndTime.Caption:='Naaiaiy: '+ DayOfWeek_ + ' '+ DateToStr(Date) +#13#10+ ' ' + TimeToStr(Time);

end;

procedure TMainForm.btnPowerOffClick(Sender: TObject);

begin

ShellExecute(handle, nil,'shutdown',' -s -t 00','', SW_SHOWNORMAL);

end;

end.

unit UnitAdd;

interface

uses

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

Dialogs, StdCtrls;

type

TFormDir = class(TForm)

lbl: TLabel;

edtName: TEdit;

btnOK: TButton;

procedure btnOKClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FormDir: TFormDir;

implementation

uses

MainUnit;

{$R *.dfm}

procedure TFormDir.btnOKClick(Sender: TObject);

begin

if MainForm.lvLeft.Selected <> nil then

if CreateDir(Curr_DirL + edtName.Text) then

begin

edtName.Text:='';

LoadFileList(MainForm.lvLeft, Curr_DirL);

if Curr_DirL = Curr_DirR then

LoadFileList(MainForm.lvRight, Curr_DirR);

FormDir.Close

end

else

begin

ShowMessage('Указано неверное имя');

edtName.Text:=''

end

else

if CreateDir(Curr_DirR + edtName.Text) then

begin

edtName.Text:='';

LoadFileList(MainForm.lvRight, Curr_DirR);

if Curr_DirR = Curr_DirL then

LoadFileList(MainForm.lvLeft, Curr_DirL);

FormDir.Close

end

else

begin

ShowMessage('Указано неверное имя');

edtName.Text:=''

end;

end;

end.

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, ExtCtrls;

type

TFormAbout = class(TForm)

mmo1: TMemo;

Image1: TImage;

lbl1: TLabel;

private

{ Private declarations }

public

{ Public declarations }

end;

var

FormAbout: TFormAbout;

implementation

uses

MainUnit;

{$R *.dfm}

end.

Размещено на Allbest.ru


Подобные документы

  • Теоретическое изучение и практическое применение приёмов работы с файлами в операционной системе Windows 95. Файлы и папки: основные понятия и правила формирования имен файлов в Windows. Характеристика и анализ особенностей операций с файлами и папками.

    контрольная работа [139,9 K], добавлен 09.03.2011

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

    лабораторная работа [156,1 K], добавлен 23.10.2013

  • Понятие файлового менеджера. Специальные программы-оболочки, разработанные для операционной среды DOS. Norton Commander - популярный файловый менеджер для DOS. Обзор файловых менеджеров для операционной системы MS Windows, их основные преимущества.

    курсовая работа [4,3 M], добавлен 07.03.2015

  • Программа операционной системы. Перемещение и копирование объектов. Окна Windows, операционное меню, настройка свойств папки, вызов справки Windows. Работа с дисками, папками и файлами, с приложениями и документами. Стандартные программы Windows.

    контрольная работа [21,9 K], добавлен 29.01.2011

  • Изучение сущности и основных задач файловой системы. Принципы работы с папками и файлами. Комплекс системных программных средств, реализующих управление файлами: создание, уничтожение, чтение, запись, именование, поиск и другие операции над файлами.

    курсовая работа [309,6 K], добавлен 11.11.2013

  • Работа с файлами, папками WINDOWS: понятие файла, папки, сохранение, переименование. Вычисление суммы порядковых номеров фамилии и имени. Алгоритм расчета себестоимости. реализация в других программах алгоритма и отчета по нему. Файлы, папки WINDOWS.

    контрольная работа [17,9 K], добавлен 05.06.2008

  • Аналіз функціонування файлового менеджера WINDOWS COMMANDER. Ключові якості програми: операцї з файлами, управління архівами, локальні меню, вбудований FTP-клієнт. З'днання з іншим комп'ютером. Контрольні суми. Функції різних версій WINDOWS COMMANDER.

    дипломная работа [48,2 K], добавлен 14.12.2007

  • Методы и приемы работы в операционной системе Windows XP, часто используемой при работе с персональным компьютером. Средства по настройке и конфигурации операционной системы. Соответствие используемых аппаратных средств потребностям пользователя.

    курсовая работа [4,7 M], добавлен 15.07.2009

  • Устройство и функции портативных персональных компьютеров. Технические характеристики; компоненты ПК: дисплей, клавиатура, устройство указания; преимущества и недостатки. Файловый менеджер: назначение, типовые операции с файлами, папками и дисками.

    контрольная работа [68,4 K], добавлен 14.09.2014

  • Создание приложения Windows, позволяющего автоматизировать процесс обработки информации студентов университета. Организация работы с физическими файлами в языках программирования. Изучение средств IDE Delphi для организации работы с текстовыми файлами.

    курсовая работа [1,5 M], добавлен 08.11.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.