- •Методические указания к выполнению работы Внутренняя организация мп семейства 80х86 в реальном режиме работы
- •Внутренние регистры мп
- •Организация памяти
- •Система прерываний мп
- •Аппаратные прерывания в ibm pc
- •Выполнение работы
- •0: (Ax,bx,cx,dx,bp,si,di,ds,es,Flags: Word); {16-ти разр. Регистры}
- •1: (Al,ah,bl,bh,cl,ch,dl,dh); {8-ми разр. Регистры}
- •Контрольные вопросы
- •Методические указания к выполнению работы
- •Контрольные вопросы
- •Лабораторная работа № 3 Средства ос Windows для управления процессами и потоками
- •Подготовка к работе
- •Программа работы
- •Методические указания к выполнению работы Управление процессами и потоками в ос Windows
- •Выполнение работы
- •Контрольные вопросы
- •Методические указания
- •0: XPos: SmalInt; {либо как координаты X и y}
- •1: Pos: tSmallPoint; {или как одна точка]
- •Контрольные вопросы
- •Методические указания к выполнению работы Получение информации о логических дисках, томах и файлах
- •Выполнение работы
- •Контрольные вопросы
- •Библиографический список
исходные тексты разработанных модулей.
Методические указания к выполнению работы Получение информации о логических дисках, томах и файлах
При работе с файловой системой первым делом, как правило, необходимо определить конфигурацию системы, т.е. какие диски и каких типов установлены на компьютере. Это можно определить при помощи функции GetLogicalDrivers:
DWORD GetLogicalDrives(VOID)
При удачном завершении функция возвращает 32-х битовое значение, каждый бит которого указывает, существует ли соответствующее логическое устройство: бит 0 - диск А, бит 1 - диск B, бит 2 - диск С ….., бит 25 - диск Z. При неудачном завершении функция возвращает ноль.
Для получения информации о томах системы используется функция GetVolumeInformation, которая возвращает информацию, специфичную для файловой системы, связанной с каталогом, указанным первым параметром функции, остальные параметры - указатели на буферы и переменные типа DWORD:
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName,
LPTSTR lpVolumeNameBuffer,
DWORD nVolumeNameSize,
LPDWORD lpVolumeSerialNumber,
LPDWORD lpMaximumComponentLength,
LPDWORD lpFileSystemFlags,
LPTSTR lpFileSystemNameBuffer,
DWORD nFileSystemNameSize
);
Первый аргумент - lpRootPathName - является указателем на корневой каталог файловой системы, информацию о которой мы хотим получить. Если этот параметр равен NULL, то используется корневой каталог текущего диска.
Второй и третий аргументы работают в связке. Второй аргумент – lpVolumeNameBuffer - является указателем на буфер, в который будет записано имя диска, а третий - nVolumeNameSize - определяет размер этого буфера в байтах.
В четвертом аргументе - lpVolumeSerialNumber – функция возвращает серийный номер тома.
В пятом аргументе - lpMaximumComponentLength – указывается максимальная длина имени файла вместе с путем, которая допускается в данной файловой системе. Для FAT32 и NTFS данное значение равно 255.
В шестом аргументе - lpFileSystemFlags – функция возвращает двойное слово, в котором может быть записана любая комбинация флагов (табл. 23), дающая дополнительную информацию о файловой системе.
табл. 23 – Назначение битов аргумента lpFileSystemFlags
Флаг |
Значение |
Назначение |
FS_CASE_SENSITIVE |
0x00000001 |
Если этот флаг установлен, то при записи на диск сохраняется регистр букв в имени файла. |
FS_CASE_IS_PRESERVED |
0x00000002 |
Если этот флаг установлен, то файловая система поддерживает имена файлов с учетом регистра. |
FS_UNICODE_STORED_ON_DISK |
0x00000004 |
Если этот флаг установлен, то файловая система поддерживает хранение на диске имен файлов в Unicode. |
FS_PERSISTENT_ACLS |
0x00000008 |
Если этот флаг установлен, то файловая система способна оперировать со списками контроля доступа ACL (только NTFS). |
FS_FILE_COMPRESSION |
0x00000010 |
Если этот флаг установлен, то то файловая система поддерживает сжатие томов. |
FS_VOL_IS_COMPRESSED |
0x00008000 |
Если этот флаг установлен, то том, о котором запрашивается информация, был сжат. |
Седьмой и восьмой аргументы работают в связке. Седьмой аргумент – lpFileSystemNameBuffer - является указателем на буфер, в который будет записано название файловой системы, а третий - nFileSystemNameSize - определяет размер этого буфера в байтах.
Указатели на возвращаемые значения (lpRootPathName, lpVolumeNameBuffer, lpVolumeSerialNumber и lpFileSystemNameBuffer) должны быть перед вызовом функции инициализированы, например, с помощью процедуры GetMem.
Рекомендуется проверять возвращаемое функцией GetVolumeInformation значение. Если функция возвращает FALSE, следует проверить правильность задания входных параметров.
Для получения информации о типе диска используется функция GetDriveType:
UINT GetDriveType(LPCTSTR lpRootPathName);
В качестве единственного аргумента используется указатель на корневой каталог диска, тип которого необходимо определить. Возвращаемое функцией значение определяет тип диска (табл. 24).
табл. 24 – Типы дисков
Флаг |
Значение |
Назначение |
DRIVE_UNKNOWN |
0 |
Тип устройства определить не удалось. |
DRIVE_NO_ROOT_DIR |
1 |
Корневого каталога не существует. |
DRIVE_REMOVABLE |
2 |
Устройство со сменным носителем (гибкий диск). |
DRIVE_FIXED |
3 |
Устройство с несменным носителем (жесткий диск). |
DRIVE_REMOTE |
4 |
Удаленное устройство (сетевой диск). |
DRIVE_CDROM |
5 |
CDROM. |
DRIVE_RAMDISK |
6 |
RAM-диск. |
Функция GetDiskFreeSpace возвращает статистику о дисковом пространстве на указанном томе:
BOOL GetDiskFreeSpace (
LPCTSTR lpRootPathName,
LPDWORD lpSectorsPerCluster,
LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters,
LPDWORD lpTotalNumberOfClusters
);
Первый аргумент - lpRootPathName - является указателем на корневой каталог файловой системы, информацию о которой мы хотим получить. Если этот параметр равен NULL, то используется текущий каталог диска.
Во втором аргументе - lpSectorsPerCluster – функция возвращает число секторов в кластере.
В третьем аргументе - lpBytesPerSector – функция возвращает количество байт в секторе.
В четвертом аргументе - lpNumberOfFreeClusters – функция возвращает количество свободных кластеров на диске.
В пятом аргументе - lpTotalNumberOfClusters – функция возвращает общее количество кластеров на диске.
Выполнение работы
К п.1. После создания нового проекта, можно приступить к разработке приложения, внешний вид основного окна которого приведен на рис. 6.
рис. 6 Внешний вид основного окна приложения
К п.2. После размещения на форме компонента TComboBox, создайте обработчик события OnCreate формы и добавьте туда код для формирования списка о дисках и логических томах, присутствующих в системе:
procedure TForm1.FormCreate(Sender: TObject);
var mask,LogDrives,i: DWORD;
begin
LogDrives:=GetLogicalDrives;
mask:=1;
i:=0;
repeat
if (mask and LogDrives) <> 0
then ComboBox1.AddItem(chr(ord('A')+i)+':'+'\',nil);
i:=i+1;
mask:=mask shl 1;
until mask = 0;
end;
К п.3. Для отображения информации о выбранном в компоненте ComboBox1 диске или логическом томе, вначале разместите на форме компонент StringGrid1.
Для отображения информации о выбранном диске используются возвращаемые параметры функций GetVolumeInformation, GetDiskFreeSpace и GetDriveType. Кроме того, необходимо определить производные параметры такие как: количество занятых кластеров на диске, и количество свободной, занятой и общей памяти подсчитанной в байтах. Поэтому в раздел public класса TForm1 добавьте следующие переменные:
TForm1 = class(TForm)
……………
// компоненты формы
private
{ Private declarations }
public
{ Public declarations }
SectorsPerClaster,BytesPerSector,FreeClasters,Clusters: DWORD;
Free,Busy,All: Int64;
MaxCompLength,FileSystemFlags: DWORD;
RootPathName,VolNameBuf,FileSystemNameBuf: PChar;
VolSerialNumber: PDWORD;
end;
Теперь добавьте в ранее созданный обработчик события OnCreate формы код для вывода названий параметров диска в соответствии с описаниями тех же функций:
procedure TForm1.FormCreate(Sender: TObject);
var mask,LogDrives,i: DWORD;
begin
……………
// определение имеющихся в системе дисков
……………
for i:=0 to high(InfoDrive) do
StringGrid1.Cells[0,i]:=InfoDrive[i]; // массив строк
// параметров
GetMem(VolNameBuf,255);
GetMem(VolSerialNumber,255);
GetMem(FileSystemNameBuf,255);
end;
Здесь же выделяется динамическая память (функция GetMem) для хранения строк имен тома, серийного номера тома и имени файловой системы.
Для обновления информации в таблице параметров после выбора нового диска необходимо создать обработчик события OnChange компонента Combobox1, в котором и будет осуществляться запрос информации о выбранном диске:
procedure TForm1.ComboBox1Select(Sender: TObject);
var sDriveType: string;
BytesPerClaster: Int64;
begin
RootPathName:=PChar(ComboBox1.Items.Strings[ComboBox1.ItemIndex]);
if GetVolumeInformation(RootPathName,VolNameBuf,255,
VolSerialNumber,MaxCompLength,FileSystemFlags,
FileSystemNameBuf,255) then begin
StringGrid1.Cells[1,0]:=RootPathName;
StringGrid1.Cells[1,1]:=VolNameBuf;
StringGrid1.Cells[1,2]:=IntToHex(DWORD(VolSerialNumber^),8);
StringGrid1.Cells[1,3]:=IntToStr(MaxCompLength);
StringGrid1.Cells[1,4]:=IntToHex(FileSystemFlags,8);
StringGrid1.Cells[1,5]:=FileSystemNameBuf;
endж
if GetDiskFreeSpace(RootPathName,SectorsPerClaster,
BytesPerSector,FreeClasters,Clusters) then begin
StringGrid1.Cells[1,6]:=IntToStr(SectorsPerClaster);
StringGrid1.Cells[1,7]:=IntToStr(BytesPerSector);
StringGrid1.Cells[1,8]:=IntToStr(FreeClasters);
StringGrid1.Cells[1,9]:=IntToStr(Clusters-FreeClasters);
StringGrid1.Cells[1,10]:=IntToStr(Clusters);
end
BytesPerClaster:=SectorsPerClaster*BytesPerSector;
All:=BytesPerClaster*Clusters;
Free:=BytesPerClaster*FreeClasters;
Busy:=All-Free;
StringGrid1.Cells[1,11]:=IntToStr(Free);
StringGrid1.Cells[1,12]:=IntToStr(Busy);
StringGrid1.Cells[1,13]:=IntToStr(All);
StringGrid1.Cells[1,14]:=TypeDrive[GetDriveType(RootPathName)];
end;
При выходе из программы необходимо освободить память, выделенную под буферы строк:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeMem(VolNameBuf,255);
FreeMem(VolSerialNumber,255);
FreeMem(FileSystemNameBuf,255);
end;
Контрольные вопросы
Файловая система FAT12.
Файловая система FAT16.
Файловая система FAT32.
Файловая система NTFS.
Файловая система CDFS.
Cредства Win32 API и Delphi для получения информации о логических дисках, томах и файлах;
Cредства Win32 API и Delphi для работы с логическими дисками, томами и файлами.
Библиографический список
1. Древс Ю.Г. Организация ЭВМ и вычислительных систем: Учебник для вузов. –М.: Высшая школа. 2006. -501 с.
2.Олифер В.Г., Олифер Н.А. Сетевые операционные системы. Учебник для вузов. 2-е издание. – СПб.: Питер. 2008. 669 с.
3. Буза М.К. Архитектура компьютеров. Минск: Новое знание. 2007. -558 с.
4. Гордеев А.В. Операционные системы: Учебник для вузов. 2-е издание. –СПб.: Питер, 2007. 416 с.
5.Степанов А.Н. Архитектура вычислительных систем и компьютерных сетей. Учебное пособие. С-П. Питер, 2006, 512 с