Файловый менеджер
Разработка файловового менеджера "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