Разработка приложения для графического представления файловой системы
Разработка программы, выдающей информацию о размещении файлов и папок на логическом диске пользователя. Ознакомление с языком высокого уровня Delphi. Системные функции доступа к файлам. Создание приложения для графического представления файловой системы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 07.02.2016 |
Размер файла | 311,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http: //www. allbest. ru/
Министерство образования Республики Беларусь
Учреждение образования
«Гомельский государственный университет имени Франциска Скорины»
Заочный факультет
Кафедра математических проблем управления
Курсовой проект
по дисциплине «Операционные системы и системное программирование»
Разработка приложения для графического представления файловой системы
Исполнитель студент группы ПОз-31 А.А. Бакум
Научный руководитель
ассистент кафедры МПУ О.А. Шимчик
Гомель 2016
Содержание
1. Используемые инструменты и технологии
2. Описание программной реализации приложения
3. Описание графического интерфейса программы
Заключение
Список использованных источников
Приложения
Введение
Целью данной курсовой работы является разработка приложения для графического представления файловой системы.
Пользователю иногда бывает интересно знать, в каком месте жесткого диска находится тот или иной файл и какие кластеры он занимает. Это может быть полезно при общем анализе быстродействия системы, ведь известно, что файлы, расположенные в более быстрых частях винчестера обрабатываются намного эффективней.
Понятие кластер включает в себя минимальное дисковое пространство, которое система выделяет для хранения одного файла. Как правило, в файловой системе NTFS размер кластера составляет 4 килобайта.
Когда на жесткий диск записывается некий файл, размером скажем 18 килобайт, он условно делится на пять частей, которые записываются в свободные кластеры, причем последний, пятый, оказывается заполненным только наполовину. Это оставшееся пустое пространство финализируется, то есть записать на него уже ничего нельзя. Соответственно чем крупнее кластер, тем больше будет расходоваться дискового пространства впустую, а кроме того, если размер кластера превышает 4 килобайта, функции сжатия, встроенные в систему окажутся недоступными.
В результате работы была разработана программа, строящая графическую карту раздела диска, посредством которой можно определить какой файл, где находится (какие кластеры занимает) и освоены навыки системного программирования в операционных системах.
1. Используемые инструменты и технологии
Операционная система - программа, управляющая аппаратными и программными средствами компьютера, которые предназначены для выполнения задач пользователя.
При включении компьютера операционная система загружается в память раньше остальных программ и затем служит платформой и средой для их работы. Помимо вышеуказанных функций ОС может осуществлять и другие, например, предоставление пользовательского интерфейса, сетевое взаимодействие и т. п.
С 1990-х наиболее распространёнными операционными системами для персональных компьютеров и серверов являются ОС семейства Microsoft Windows, Mac OS, системы класса UNIX, и Unix подобные (особенно GNU/Linux).
Основные простейшие функции ОС:
· - Управление аппаратными средствами, обеспечение доступа к периферийным устройствам (устройствам ввода-вывода);
· - управление оперативной памятью (распределение между процессами, программами, защита доступа, виртуальная память или swap (англ. swap), кэширование и т.п.);
· - обеспечение файлового ввода-вывода, как правило с помощью файловой системы (в основном для обеспечения управления доступом к данным на энергонезависимых носителях, таких как «жёсткий» диск, компакт-диск и т. п.);
· - загрузка приложений в оперативную память и их выполнение;
· - обеспечение пользовательского интерфейса от простейшей командной строки (некоторые сетевые ОС) до многофункциональных графических (Windows, MAC OS, KDE для UNIX подобных ОС);
· - обеспечение сетевого взаимодействия (поддержка стека сетевых протоколов).
Файловая система - порядок, определяющий способ организации, хранения и именования данных на носителях информации в компьютерах, а также в другом электронном оборудовании: цифровых фотоаппаратах, мобильных телефонах и т.п. Файловая система определяет формат содержимого и способ физического хранения информации, которую принято группировать в виде файлов. Конкретная файловая система определяет размер имен файлов и (каталогов), максимальный возможный размер файла и раздела, набор атрибутов файла. Некоторые файловые системы предоставляют сервисные возможности, например разграничение доступа или шифрование файлов.
Файловая система связывает носитель информации с одной стороны и API для доступа к файлам-- с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация в конкретном файле, так же как и на каком физическом типе носителя (CD, жёстком диске, магнитной ленте, блоке флеш-памяти или другом) он записан. Всё, что знает программа, -- это имя файла, его размер и атрибуты. Эти данные она получает отдрайвера файловой системы. Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жёстком диске).
С точки зрения операционной системы (ОС), весь диск представляет собой набор кластеров (как правило, размером 512 байт и больше)[1]. Драйверы файловой системы организуют кластеры в файлы и каталоги (реально являющиеся файлами, содержащими список файлов в этом каталоге). Эти же драйверы отслеживают, какие из кластеров в настоящее время используются, какие свободны, какие помечены как неисправные.
Однако файловая система не обязательно напрямую связана с физическим носителем информации. Существуют виртуальные файловые системы, а также сетевые файловые системы, которые являются лишь способом доступа к файлам, находящимся на удалённом компьютере.
Совокупность каталогов и системных структур данных, отслеживающих размещение файлов на диске и свободное дисковое пространство, называется файловой системой. Основной структурной единицей любой файловой системы является файл и каталог.
В большинстве файловых систем пространство на диске выделяется кластерами, которые состоят из нескольких секторов. Кластер - минимальный размер места на диске, которое может быть выделено для хранения одного файла.
Один физический жесткий диск может быть разделен на несколько разделов - логических дисков (томов). Каждый логический диск представляет собой как бы отдельное устройство. Следовательно, на нем может быть своя файловая система и свой корневой каталог.
Информация о логической организации физического жесткого диска (числе логических дисков, их размере) расположена в главной загрузочной записи - Master Boot Record (MBR). MBR расположена в самом первом секторе жесткого диска и не входит в структуру файловой системы.
Файловая система NTFS (файловая система новой технологии), как и многие другие файловые системы, делит дисковое пространство тома на кластеры размером от 512 байт до 64 Кб. На практике размер кластера обычно не превышает 4Кб. Все дисковое пространство в NTFS делится на две неравные части (рис.1). Первые 12% диска отводятся под зону MFT - главной таблицы файлов. Эта таблица представляет собой специальный файл, содержащий информацию о размещении всех остальных файлов. Остальные 88% тома представляют собой обычное пространство для записи файлов.
Табл. 1 Структура тома NTFS
MFT |
Зона MFT |
Зона для размещения файлов и каталогов |
Копия первых 16 записей MFT |
Зона для размещения файлов и каталогов |
Таблица файлов поделена на записи фиксированного размера в 1 Кб. Каждая запись соответствует конкретному файлу. Первые 16 файлов тома являются служебными и недоступны через интерфейс операционной системы. Эти файлы называются метафайлами, причем самый первый метафайл - это сам файл MFT. Часть диска, содержащая метафайлы, является единственной частью диска имеющей строго фиксированное положение. Копии этих файлов (для надежности, поскольку они очень важны) хранится в середине тома. Оставшаяся часть MFT может располагаться в произвольном месте диска. Определить её положение можно с помощью самого файла MFT. Метафайлы находятся в корневом каталоге тома NTFS. Их имена начинаются с символа « $ ». Основные метафайлы приведены в таблице 2.
Табл. 2 Метафайлы NTFS
Имя метафайла |
Описание |
|
$MFT |
Файл с таблицей MFT |
|
$MFTmirr |
Копия первых 16 записей табл.MFT, размещенная посередине тома |
|
$LogFile |
Файл журнала |
|
$Volume |
Служебная информация - метка тома, версия ФС и т.д. |
|
$AttrDef |
Список стандартных атрибутов файлов на томе |
|
$ |
Корневой каталог |
|
$Bitmap |
Битовая карта свободного места тома |
|
$Boot |
Загрузочный сектор (если раздел загрузочный) |
|
$Quota |
Файл, с записями прав пользователей на работу с данными |
|
$Upcase |
Файл с таблицей соответствия строчных и прописных букв в именах файлов. В NTFS имена файлов в Unicode. |
В таблице MFT хранится вся информация о файлах: имя файла, его размер, расположение на диске и т.п. Если для размещения информации не хватает одной записи MFT, то используется несколько таких записей, причем необязательно последовательных. Если файл маленький, то информация, содержащаяся в нем, хранится прямо в соответствующей записи MFT в оставшемся от служебных данных месте. Таким образом, файлы, занимающие не более сотни байтов, обычно не записываются в основную файловую область - вся информация таких файлов хранится прямо в таблице MFT.
В данном курсовом проекте работа с файловой системой была реализована посредством интерфейса прикладного программирования Windows API.
Интерфейс прикладного программирования WindowsAPI (application programming interface) является интерфейсом системного программирования в пользовательском режиме для семейства операционных систем Windows. До выхода 64-разрядных версий Windows программный интерфейс для 32-разрядных версий операционных систем Windows назывался Win32 API, чтобы его можно было отличить от исходной 16-разрядной версии Windows API (которая служила интерфейсом программирования для начальных 16-разрядных версий Windows).
Windows API состоит из нескольких тысяч вызываемых функций, которые разбиты на следующие основные категории:
· Базовые службы (Base Services).
· Службы компонентов (Component Services).
· Службы пользовательского интерфейса (User Interface Services).
· Графические и мультимедийные службы (Graphics and Multimedia Services).
· Обмен сообщениями и совместная работа (Messaging and Collaboration).
· Сеть (Networking).
· Веб-службы (Web Services).
В качестве языка программирования была выбрана среда программирования Delphi из пакета RAD Studio XE2, как один из наиболее простых в использовании, но в то же время являющийся достаточно мощным и гибким инструментом в руках программиста.
Процесс разработки в Delphi предельно упрощен. В первую очередь это относится к созданию интерфейса, на который уходит 80% времени разработки программы. Программист просто помещает нужные компоненты на поверхность Windows-окна (в Delphi оно называется формой) и настраивает их свойства с помощью специального инструмента (Object Inspector). С его помощью можно связать события этих компонентов (нажатие на кнопку, выбор мышью элемента в списке и т.д.) с кодом его обработки - и вот простое приложение готово. Причем разработчик получает в свое распоряжение мощные средства отладки (вплоть до пошагового выполнения команд процессора), удобную контекстную справочную систему (в том числе и по Microsoft API), средства коллективной работы над проектом, всего просто не перечислить. Можно создавать компоненты ActiveX без использования Microsoft IDL, расширять возможности web-сервера (скрипты на стороне сервера), практически ничего не зная об HTML, XML или ASP. Можно создавать распределенные приложения на базе СОМ и CORBA, Интернет- и intranet-приложения, используя для доступа к данным Borland DataBase Engine, ODBC-драйверы или Microsoft ADO. Появившаяся, начиная с Delphi 3, поддержка многозвенной технологии (multi-tiered) доступа к данным позволяет создавать масштабируемые приложения (относительно слабо зависящие от сервера БД) за счет перенесения методов обработки информации (бизнес-правил) на среднее звено.
В Delphi используется язык Object Pascal, который постоянно расширяется и дополняется Borland. Язык в полной мере поддерживает все требования, предъявляемые к объектно-ориентированному языку программирования. Как и положено строго типизированному языку, классы поддерживают только простое наследование, но зато интерфейсы могут иметь сразу несколько предков. К числу особенностей языка следует отнести поддержку обработки исключительных ситуаций (exceptions), а также перегрузку методов и подпрограмм (overload) в стиле C++. К числу удачных относится также поддержка длинных строк в формате WideChar и AnsiChar. Последний тип (AnsiString) позволяет использовать все прелести динамического размещения информации в памяти без всяких забот о ее выделении и сборке мусора Delphi делает это автоматически. Для поклонников свободного стиля программирования имеются открытые массивы, варианты и вариантные массивы, позволяющие размещать в памяти все, что душе угодно и смешивать типы данных.
Есть возможность создавать свои собственные компоненты, импортировать ОСХ-компоненты. Мало того, Delphi предоставляет разработчику интерфейс для связи ваших приложений (или внешних программ) с интегрированной оболочкой Delphi (IDE).
Таким образом, можно использовать Delphi для создания как самых простых приложений, на разработку которых требуется 2-3 часа, так и серьезных корпоративных проектов, предназначенных для работы десятков и сотен пользователей.
2. Описание программной реализации приложения
Как уже говорилось выше, данная программа позволяет просмотреть т.н. карту логического диска. Т.е. дать возможность пользователю увидеть, в каких кластерах диска находится тот или иной файл. Либо же обратным методом узнать, часть какого файла записана в данном кластере.
Алгоритм работы программы был реализован следующим образом:
· получение полного списка всех файлов и каталогов логического диска с сохранением его в строковом и целочисленном массивах (имя, программный код ID, тип объекта)
· вызов API функции DeviceIoControl с управляющим кодом FSCTL_GET_VOLUME_BITMAP.
BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped );
hDevice[in] - дескриптор устройства на котором должна выполниться операция. Это устройство - обычно том, каталог, файл или поток.
dwIoControlCode [in] - управляющий код для операции. Это значение идентифицирует конкретную операцию для выполнения и тип устройства, на котором она должна осуществиться.
nInBufferSize [in] - размер буфера ввода данных, в байтах.
lpOutBuffer [out] - указатель на буфер вывода данных, который должен получить данные, возвращенные операцией. Формат этих данных зависит от значения параметра dwIoControlCode.
nOutBufferSize [in] - размер буфера вывода данных, в байтах.
lpBytesReturned [out] - указатель на переменную, которая получает размер данных, сохраненных в буфере вывода данных, в байтах.
lpOverlapped [in] - указатель на структуру OVERLAPPED. Если параметр hDevice открывался без определения FILE_FLAG_OVERLAPPED, параметр lpOverlapped игнорируется.
· отрисовка в компоненте StringGrid карты логического диска. Карта строится на основании битового вектора, полученного в результате работы функции DeviceIoControl - выходной параметр lpOutBuffer
Программа разбита на два модуля.
Модуль MainU - основной. В нем описывается главное окно приложения, а также находятся следующие функции и процедуры:
· процедура GetDriveBitmap(Drive : char) - получает битовый вектор, в котором хранится карта дискового пространства на логическом диске Drive;
· процедура GridResize () - выполняет перерисовку компонента StringGrid в зависимости от размеров окна приложения;
· функция FileNameByCluster(Drive : char; Clust : int64) : string - возвращает имя файла или каталога, размещенного в кластере под номером Clust на логическом диске Drive;
· функция FileAllocation(AFileName : string; _ID : integer): cardinal - получение списка кластеров, занимаемых объектом AFileName;
· процедура FillStringGrid(sectors : int64) - заполняет компонент StringGrid;
· процедура ScanDir(StartDir: string; Mask : string) - получает список файлов и папок в директории StartDir и заполняет массивы Files (полный путь к папке или файлу), FilesID (внутренний программный код файла или папки) и TypeObj (тип объекта - файл или папка).
Модуль ViewU, описывающий форму с находящимся на ней компоненте ValueListEditor.
Описание графического интерфейса программы
При запуске программы перед пользователем появляется главное окно приложения (рис 1). В центральной части окна (поле 1) будет выводится в графическом виде информация о степени заполнения логического диска данными. При двойном нажатии на данном поле в отдельном окне (прилож.Б рис. 2 ) выдается информация о том, какой объект (файл или папка) находятся в данном кластере. Логический диск пользователь может выбрать в нижней части (3) и нажать кнопку «Карта диска» (4). При помощи т.н. «ползунка» (5) можно задать масштаб отображения данных. При нажатии на кнопку 2 откроется диалоговое окно выбора файла, для которого будет выдана информация о занимаемых им кластерах.
delphi графический файловый пользователь
Рис. 1 основное окно приложения
Заключение
В результате проделанной работы была создана программа, выдающая информацию о размещении файлов и папок на логическом диске пользователя. Во время проведения работы были закреплены навыки работы с языком высокого уровня Delphi, а также приобретены новые в работе с некоторыми системными функциями доступа к файловой системе. Из того, что хотелось бы улучшить в программе, можно отметить долгое время работы функции ScanDir, получающей список файлов и папок на диске.
Список использованных источников
1 Windows Dev Center [Электронный ресурс] // URL: https://msdn.microsoft.com/en-гs/library/windows/desktop/ aa363216(v=vs.85).aspx
2 Форум программистов [Электронный ресурс] // URL: http://programmersforum,ru
3 Мастера DELPHI [Электронный ресурс] // URL: http://www.delphimaster.ru
Приложение А
Программный код разработанного приложения.
Модуль MainU
unit MainU;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Grids,
Vcl.ComCtrls,Math, Vcl.FileCtrl, Vcl.ValEdit,ADODB,
Data.DB;
const
FSCTL_GET_RETRIEVAL_POINTERS = $90073;
type
TF_Main = class(TForm)
OpenDialog1: TOpenDialog;
Panel2: TPanel;
Panel3: TPanel;
Label1: TLabel;
Button1: TButton;
TrackBar1: TTrackBar;
DriveComboBox1: TDriveComboBox;
Panel1: TPanel;
Label2: TLabel;
Edit1: TEdit;
Button3: TButton;
StringGrid1: TStringGrid;
Panel4: TPanel;
Label3: TLabel;
Label4: TLabel;
Button4: TButton;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure StringGrid1DblClick(Sender: TObject);
private
{ Private declarations }
Sectors : string;
iNSec,Cnt,CntBits : int64;
iCol,iRow,Chains : integer;
CanDrawGrid,CanReadCluster : boolean;
FClusters,DClusters : array of string;
FreeBytes: int64;
FreeSize: int64;
TotalBytes: int64;
IDFile,CL_From,CL_To : array of int64;
function FileNameByCluster(Drive : char; Clust:int64) : string;
procedure GetDriveBitmap(Drive : char);
function ScrollBarVisible(Handle : HWnd; Style : Longint) : Boolean;
procedure GridResize;
function CTL_CODE(DeviceType,_Function, Method, Access: Cardinal): Cardinal;
public
function FileAllocation(AFileName : string;
Flag : boolean;
_ID : integer):cardinal;
{ Public declarations }
end;
type
_VOLUME_BITMAP_BUFFER =
record
StartingLcn : int64;
BitmapSize : int64;
Buffer : array [0..0]of byte;
end;
var
F_Main: TF_Main;
ID : integer;
base: ^_VOLUME_BITMAP_BUFFER;
BitV : array of byte;
Files : array of string;
FileId, TypeObj : array of integer;
implementation
{$R *.dfm}
uses Functions, ViewU;
//------------------------------------------------------------------------------
function TF_Main.FileNameByCluster(Drive : char; Clust:int64) : string;
var
i,j : integer;
Fl : boolean;
begin
i := 0;
j := 0;
Fl := false;
if CanReadCluster then begin
for i := 0 to Cnt-1 do begin
if (Clust>=CL_From[i]) AND (Clust <= CL_To[i]) then begin
Fl := true;
break;
end;
end;
if Fl then begin
for j := 0 to ID-1 do
if IDFile[i] = FileId[j] then
break;
FileAllocation(Files[j],false,0);
F_View.VLE.Strings.Clear;
for i := 0 to Chains-1 do
F_View.VLE.InsertRow(FClusters[i],DClusters[i],true);
if Length(Files[j]) > 80 then
Insert(' ',Files[j],80);
F_View.Label1.Caption := Files[j];
if TypeObj[j] = 1 then
F_View.Label2.Caption := 'Файл:'
else
F_View.Label2.Caption := 'Папка:';
F_View.Caption := 'Кластер № '+ IntToStr(iNSec);
F_View.ShowModal();
end
else
ShowMessage('Кластер № '+IntToStr(iNSec) + #13#10+ 'Кластер свободен');
end
else
ShowMessage('Кластер № '+IntToStr(iNSec) + #13#10+ 'Файл: не опознан' );
end;
//---------------------------------------------------------------------------
procedure TF_Main.GetDriveBitmap(Drive : char);
Type
_STARTING_LCN_INPUT_BUFFER =
Record
StartingLcn : int64;
End;
var
lpinbuf: ^_STARTING_LCN_INPUT_BUFFER;
hDevice: Cardinal;
i: Cardinal;
lpBytesReturned: PDWORD;
j: byte;
r: LongBool;
FSCTL_GET_VOLUME_BITMAP: Cardinal;
col, row, ClusterCounter: integer;
EmptyClusterFlag: boolean;
begin
CanDrawGrid := false;
hDevice := CreateFile(PChar('\\.\'+Drive+':'),GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then
Exit;
GetMem(base, sizeof(_VOLUME_BITMAP_BUFFER)+1024*1024*40);
GetMem(lpinbuf, sizeof(_STARTING_LCN_INPUT_BUFFER));
GetMem(lpBytesReturned, sizeof(DWORD));
lpinbuf.StartingLcn := 0;
FSCTL_GET_VOLUME_BITMAP := CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS);
r := DeviceIOControl(hDevice,
FSCTL_GET_VOLUME_BITMAP,
lpinbuf,
sizeof(_STARTING_LCN_INPUT_BUFFER),
base,
sizeof(_VOLUME_BITMAP_BUFFER)+1024*1024*40,
lpBytesReturned^,
nil);
CntBits := lpBytesReturned^;
SetLength(BitV,lpBytesReturned^*8);
FillStringGrid(lpBytesReturned^);
CanDrawGrid := true;
CloseHandle(hDevice);
FreeMem(base, sizeof(_VOLUME_BITMAP_BUFFER)+1024*1024*40);
FreeMem(lpinbuf, sizeof(_STARTING_LCN_INPUT_BUFFER));
FreeMem(lpBytesReturned, sizeof(DWORD));
end;
//------------------------------------------------------------------------------
function TF_Main.CTL_CODE(DeviceType, _Function, Method, Access: Cardinal): Cardinal;
begin
Result := (DeviceType shl 16) or (Access Shl 14) or (_Function shl 2) or (Method);
end;
//------------------------------------------------------------------------------
function TF_Main.FileAllocation(AFileName:string;Flag : boolean; _ID : integer):cardinal;
type
TExt = packed record
NextVcn: LARGE_INTEGER;
Lcn: LARGE_INTEGER;
end;
PRETRIEVAL_POINTERS_BUFFER = ^_RETRIEVAL_POINTERS_BUFFER;
_RETRIEVAL_POINTERS_BUFFER = packed record
ExtentCount: DWORD;
StartingVcn: TLargeInteger;
Extents: array [0..0] of TExt;
end;
_STARTING_VCN_INPUT_BUFFER = packed record
StartingVcn: TLargeInteger;
end;
var
Handle : THandle;
i,cbBytesReturned,FSCTL_GET_RETRIEVAL_POINTER_BASE : cardinal;
ok : boolean;
iBuf : _STARTING_VCN_INPUT_BUFFER;
oBuf : array of byte;
ppointers : PRETRIEVAL_POINTERS_BUFFER;
First : int64;
LcnLen : integer;
begin
Result:=0;
First := 0;
Sectors := '';
Handle := CreateFile (PChar(AFileName),0,FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0);
if (Handle=INVALID_HANDLE_VALUE) then
exit;
try
iBuf.StartingVcn := 0;
SetLength(oBuf,16*1024);
ok := DeviceIoControl (
Handle,
FSCTL_GET_RETRIEVAL_POINTERS,
@iBuf, sizeof(iBuf),
@oBuf[0], length(oBuf),
cbBytesReturned,
nil
);
if ok then begin
ppointers:=@oBuf[0];
// Возвращаем номер первого кластера файла
Result := ppointers.Extents[0].Lcn.HighPart;
Chains := ppointers.ExtentCount;
if not Flag then begin
SetLength(FClusters,Chains);
SetLength(DClusters,Chains);
end;
if Chains > 0 then begin
for i:=0 to Chains-1 do begin
LcnLen := ppointers.Extents[i].NextVcn.HighPart - First;
if not Flag then begin
FClusters[i] := intToStr(First)+'-'+
IntToStr(ppointers.Extents[i].NextVcn.HighPart-1);
DClusters[i] := IntToStr(ppointers.Extents[i].Lcn.HighPart)+'-'+
IntToStr(ppointers.Extents[i].Lcn.HighPart+LcnLen-1);
end
else begin
Inc(Cnt);
SetLength(IDFile,Cnt*sizeof(integer));
SetLength(CL_From,Cnt*sizeof(integer));
SetLength(CL_To,Cnt*sizeof(integer));
IDFile[Cnt-1] := _ID;
CL_From[Cnt-1] := ppointers.Extents[i].Lcn.HighPart;
CL_To[Cnt-1] := ppointers.Extents[i].Lcn.HighPart+LcnLen-1;
end;
First := ppointers.Extents[i].NextVcn.HighPart;
end;
end;
end
except
CloseHandle(Handle);
end;
end;
//------------------------------------------------------------------------------
procedure TF_Main.Button1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
Cnt:=0;
ID := 0;
CanReadCluster := false;
Label4.Font.Color := clRed;
Label4.Caption := 'обрабатываются';
ScanDir(DriveComboBox1.Drive+':','*.*');
Label4.Font.Color := clGreen;
Label4.Caption := 'получены';
CanReadCluster := true;
GetDiskFreeSpaceEx(PChar(DriveComboBox1.Drive+':'),
FreeBytes,
TotalBytes,
@FreeSize);
GetDriveBitmap(DriveComboBox1.Drive);
GridResize;
StringGrid1.Repaint;
Label5.Caption := 'Размер диска - '+
FloatToStr(RoundTo(TotalBytes/1024/1024/1024,-2)) + ' Г'+
' Кластеров - '+ IntToStr(Round(TotalBytes/4096));
Screen.Cursor := crDefault;
Application.ProcessMessages;
end;
//------------------------------------------------------------------------------
procedure TF_Main.Button3Click(Sender: TObject);
var
i : integer;
begin
if OpenDialog1.Execute then begin
FileAllocation(OpenDialog1.FileName,false,0);
F_View.VLE.Strings.Clear;
for i := 0 to Chains-1 do
F_View.VLE.InsertRow(FClusters[i],DClusters[i],true);
F_View.Label1.Caption := OpenDialog1.FileName;
Edit1.Text := OpenDialog1.FileName;
F_View.Caption := 'Файл '+ ExtractFileName(OpenDialog1.FileName);
F_View.ShowModal();
end;
end;
//------------------------------------------------------------------------------
procedure TF_Main.Button4Click(Sender: TObject);
var
i : integer;
begin
FileAllocation(Edit1.Text,false,0);
F_View.VLE.Strings.Clear;
for i := 0 to Chains-1 do
F_View.VLE.InsertRow(FClusters[i],DClusters[i],true);
F_View.ShowModal();
end;
//------------------------------------------------------------------------------
procedure TF_Main.FormResize(Sender: TObject);
begin
GridResize;
StringGrid1.Repaint;
end;
//------------------------------------------------------------------------------
procedure TF_Main.FormShow(Sender: TObject);
begin
Label4.Font.Color := clRed;
Label4.Caption := 'не получены';
DriveComboBox1.Drive := 'C';
CanReadCluster := false;
CanDrawGrid := false;
StringGrid1.DefaultColWidth := Round(Power(2,TrackBar1.Position));
StringGrid1.DefaultRowHeight := Round(Power(2,TrackBar1.Position));
end;
//------------------------------------------------------------------------------
procedure TF_Main.StringGrid1DblClick(Sender: TObject);
begin
if (iNSec<=(Round(TotalBytes/4096)-1)) and (CntBits > 0) then
FileNameByCluster(DriveComboBox1.Drive,iNsec);
end;
//------------------------------------------------------------------------------
procedure TF_Main.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if CanDrawGrid then begin
if ARow*StringGrid1.ColCount+ACol <= Round(TotalBytes/4096)-1 then begin
if BitV[ARow*StringGrid1.ColCount+ACol]=1 then
StringGrid1.Canvas.Brush.Color:=clBlue
else
StringGrid1.Canvas.Brush.Color:=clWhite;
StringGrid1.Canvas.FillRect(Rect);
end
else begin
StringGrid1.Canvas.Brush.Color:=clBtnFace;
StringGrid1.Canvas.FillRect(Rect);
end;
end
else begin
StringGrid1.Canvas.Brush.Color:=clWhite;
StringGrid1.Canvas.FillRect(Rect);
end;
end;
//------------------------------------------------------------------------------
procedure TF_Main.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
iNumSec :integer;
begin
StringGrid1.MouseToCell(X,Y,iCol,iRow);
iNSec := iCol+iRow*StringGrid1.ColCount;
end;
//------------------------------------------------------------------------------
procedure TF_Main.TrackBar1Change(Sender: TObject);
begin
StringGrid1.DefaultColWidth := Round(Power(2,TrackBar1.Position));
StringGrid1.DefaultRowHeight := Round(Power(2,TrackBar1.Position));
GridResize;
StringGrid1.Realign;
StringGrid1.Repaint;
StringGrid1.Repaint;
end;
//------------------------------------------------------------------------------
procedure TF_Main.GridResize;
var
GridWidth,ScrollBarWidth,Border : integer;
begin
if CntBits > 0 then begin
with F_Main do begin
if ScrollBarVisible(StringGrid1.Handle, WS_VSCROLL) then
ScrollBarWidth := GetSystemMetrics(SM_CXVSCROLL)
else
ScrollBarWidth := 0;
if TrackBar1.Position = 0 then
StringGrid1.GridLineWidth := 0
else
StringGrid1.GridLineWidth := 1;
GridWidth := StringGrid1.Width - ScrollBarWidth;
StringGrid1.ColCount := Round((GridWidth-5)/ (StringGrid1.DefaultColWidth+StringGrid1.GridLineWidth));
StringGrid1.RowCount := (Ceil(CntBits*8/StringGrid1.ColCount));
end;
end
else begin
F_Main.StringGrid1.ColCount := 0;
F_Main.StringGrid1.RowCount := 0;
F_Main.StringGrid1.GridLineWidth := 0;
end;
end;
//------------------------------------------------------------------------------
Function TF_Main.ScrollBarVisible(Handle : HWnd; Style : Longint) : Boolean;
begin
Result := (GetWindowLong(Handle, GWL_STYLE) and Style) <> 0;
end;
end.
Модуль ViewU
unit ViewU;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ValEdit, Vcl.ExtCtrls,
Vcl.StdCtrls;
type
TF_View = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
VLE: TValueListEditor;
Panel3: TPanel;
Panel4: TPanel;
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
F_View: TF_View;
implementation
{$R *.dfm}
end.
Приложение Б
Примеры оконных форм приложения
Рис. 1 Общий вид приложения после получения данных о карте логического диска
Рис. 2 Окно, появляющееся после двойного нажатия на кластере в главном окне приложения
Рис. 3 Окно, появляющееся после ручного выбора файла на логическом диске
Размещено на Allbest.ru
...Подобные документы
Разработка приложения, автоматизирующего процесс синхронизации файлов между сменным носителем и каталогом на другом диске. Классы для работы с файловой системой. Интерфейс программы и способы взаимодействия пользователя с ним. Создание новой синхропары.
курсовая работа [632,0 K], добавлен 21.10.2015Механизмы взаимодействия драйвера режима ядра и пользовательского приложения: многослойная драйверная архитектура, алгоритм сокрытия данных, взаимодействие драйвера и приложения, пользовательский интерфейс программы фильтрации доступа к файлам.
курсовая работа [1023,3 K], добавлен 23.06.2009Разработка программы FileInfo, выдающей полную информацию о заданном файле с применением языка программирования С++, используя API функции Win 32. Использование пространств имён .NetFramework. Руководство пользователя и системные требования программы.
курсовая работа [1,2 M], добавлен 25.04.2012Характеристика форматов файлов wav и mp3. Построение диаграмм прецедентов, разработка графического интерфейса и архитектуры приложения. Разработка алгоритмов работы программы: метод TrimWavFile, TrimMp3, ChangeVolume, speedUpX1_2, speedDownX1_2.
курсовая работа [2,7 M], добавлен 20.12.2013Определение файловой системы. Виртуальные и сетевые файловые системы. Структура и версии системы FAT. Определение максимального размера кластера. Драйверы файловой системы, файлы и каталоги. Способы доступа к файлам, находящимся на удаленном компьютере.
доклад [29,2 K], добавлен 11.12.2010Общие характеристики операционной системы Android. Разработка приложения на основе создания менеджера файлов. Получение с помощью приложения доступа к файлам, хранящимся в "облачном хранилище" в сети Интернет. Расчет стоимости программного обеспечения.
дипломная работа [2,7 M], добавлен 03.04.2015Создание, изучение и разработка приложение на Android. Среда разработки приложения DelphiXE5. Установка и настройка среды программирования. Этапы разработки приложения. Инструменты для упрощения конструирования графического интерфейса пользователя.
курсовая работа [1,6 M], добавлен 19.04.2017Описание истории развития информационных технологий. Исследование предпочтений по использованию программного обеспечения пользователя персонального компьютера начального уровня и разработка интерфейсного приложения в среде программирования Delphi.
дипломная работа [2,0 M], добавлен 14.01.2012Разработка удаленной базы данных и приложения-клиента для доступа к электронным источникам литературы, содержащихся на жестком диске сервера предприятия в виде упакованных архивов файлов и пакетов файлов. Реляционное исчисление доменов. Средства Delphi.
дипломная работа [2,7 M], добавлен 24.03.2011Создание информационно-поисковой системы для реализации подержанных автомобилей. Функции и структура приложения; диаграмма классов и варианты использования. Разработка интерфейса пользователя. Исходный код программы, его распределение по файлам проекта.
курсовая работа [2,4 M], добавлен 31.05.2013Математическая формулировка задачи, принципиальная схема гидравлического демпфера. Структурная схема программы связи модулей, реализованной на языке высокого уровня Borland Delphi 7.0. Ее описание, руководство пользователя, особенности тестирования.
курсовая работа [140,0 K], добавлен 29.05.2013Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.
курсовая работа [1,3 M], добавлен 28.07.2013Понятие и физическая структура диска, описание способности системы хранить данные. Рассмотрение особенностей файловой системы FAT16. Выявление связи между размером кластера и потерями дискового пространства. Пример создания программы файлового обмена.
курсовая работа [146,1 K], добавлен 26.10.2015Разработка базы данных книжного магазина в среде программирования Delphi. Создание таблиц и их заполнение. Требования к составу и параметрам технических средств. База данных как набор файлов, содержащих информацию. Этапы создания приложения в Delphi.
курсовая работа [803,6 K], добавлен 04.11.2012Создание многоуровневого приложения с Web-интерфейсом выставления оценки фильму и просмотра оценок других пользователей. Клиентская часть приложения. Разработка многопользовательского веб-приложения на ASP.NET MVC 3 с разграничением доступа к данным.
курсовая работа [949,7 K], добавлен 22.02.2015Разработка комплекса алгоритмов. Кодирование и компиляция. Тестирование, отладка, испытание и сдача программы. Минимальные системные требования для использования Delphi 7. Написание программы с использованием инструментального языка высокого уровня.
курсовая работа [2,7 M], добавлен 21.02.2011Общая характеристика интерфейса языка программирования Delphi. Рассмотрение окна редактора кода, конструктора формы, инспектора объектов и расширения файлов. Ознакомление с основными этапами создания и сохранения простого приложения; проверка его работы.
презентация [184,3 K], добавлен 18.03.2014Форма "Form1", "Form2", "Form3" (2D) и "Form3" (3D), диаграмма классов. Тестирование, его протокол, руководство пользователя. Просмотр общих и подробных сведений статистики, графического представления в 2D и 3D, выход из приложения, листинг программы.
курсовая работа [1,4 M], добавлен 26.08.2012Обзор различных способов реализации много поточности в языках программирования и операционных системах, а также разработка прототипа приложения реализующего многопоточность. Создание приложения в Delphi, реализующего потоки выполнения уровня пользователя.
курсовая работа [86,7 K], добавлен 27.05.2012Понятие, законодательное регулирование и виды электронных подписей. Разработка структурной схемы приложения и базы данных. Создание диаграммы прецедентов и классов. Проектирование интерфейса программы. Анализ руководства пользователя web-приложения.
дипломная работа [869,8 K], добавлен 12.08.2017