Борисок Валерий Викторович - Delphi. Трюки и эффекты стр 22.

Книгу можно купить на ЛитРес.
Всего за 49 руб. Купить полную версию
Шрифт
Фон

...

Листинг 4.9. Загрузка информации о выбранном диске

procedure TForm1.cboDrivesSelect(Sender: TObject);

var info: DriveInfo;

root: String;

fullSize, freeSize: Int64;

begin

root := cboDrives.Items[cboDrives.ItemIndex];

//Загружаем информацию о выбранном диске

GetDriveInformation(root, info);

//Общая информация о диске и файловой системе

txtLabel.Text := info.DriveLabel;

txtDriveType.Text := GetDriveTypeName(root);

txtFSName.Text := info.FileSystemName;

txtSN.Text := IntToHex(Int64(info.SerialNumber), 8);

txtMaxFileName.Text := IntToStr(Integer(info.MaxFileNameLen));

//Флажки некоторых свойств файловой системы

chkCaseSensitive.Checked := info.FileSystemOptions.CaseSensitive;

chkCompression.Checked := info.FileSystemOptions.SupportCompression;

chkCompressed.Checked := info.FileSystemOptions.IsCompressed;

//Размер диска

fullSize := GetDriveSize(root);

if fullSize <> –1 then

freeSize := GetDriveFreeSpace(root)

else

begin //Ошибка при обращении к диску

fullSize := 0;

freeSize := 0;

end;

//..формирование диаграммы

driveSize.Series[0].Clear;

driveSize.Series[0].Add( freeSize, \'Свободно\');

driveSize.Series[0].Add( fullSize – freeSize, \'Занято\')

end;

При нажатии кнопки Изменить производится попытка присвоить выбранному в списке диску метку, введенную в соответствующее текстовое поле (txtLabel) (листинг 4.10).

...

Листинг 4.10.

Задание новой метки диска

procedure TForm1.Button1Click(Sender: TObject);

begin

//Изменение метки диска

if not SetDriveLabel(cboDrives.Items[cboDrives.ItemIndex],

txtLabel.Text)

then

MessageBox(self.Handle, \'Не удалось поменять метку диска\',

\'Ошибка\', MB_ICONEXCLAMATION)

else

//Перечитаем информацию о диске

cboDrivesSelect(self);

end;

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

4.2. Каталоги и пути

В этом разделе описываются некоторые полезные примеры, позволяющие узнавать расположение важных каталогов операционной системы Windows. Здесь также рассматриваются вопросы преобразования путей и приводятся некоторые алгоритмы обхода каталогов, применяемые для поиска.

Прежде чем рассматривать решения конкретных задач, следует уточнить, что за магическое число, а точнее, целочисленная константа используется в некоторых примерах, приведенных далее. Речь идет о константе МАХРАТН, равной 260. Она используется явно или неявно (функциями API) в качестве максимально возможной длины пути. Здесь налицо небольшой парадокс: хотя такая файловая система как FAT32, и реализована так, что может поддерживать неограниченную вложенность каталогов, в реальности не получится создать даже два вложенных каталога с именем длиной 255 символов.

...

Примечание

При доскональной проверке вышесказанного выяснилось, что не получится создать даже один каталоге именем длиной 255 символов в корневой папке диска (например, С: \). Каталог может иметь имя длиной максимум 244 символа. С учетом длины имени корневой папки (получается 247) можно предположить, что в таком случае система резервирует оставшиеся 13 символов, чтобы в папке можно было сохранять файлы с именем в формате 8.3 (MS-DOS).

Системные папки WINDOWS и system

Приходилось ли вам хоть раз писать приложения, работоспособность которых зависела от расположения системных папок Windows? Если да, то вы наверняка хорошо знаете, как неустойчиво предположение о том, что папка WINDOWS всегда C:\WIND0WS, a system всегда C:\WINDOWS\system. Ведь при установке операционной системы ничто не мешает поместить ее, например, на диск Е:\, а папку для Windows назвать Linux. Кроме того, системная папка Windows на платформе NT имеет имя system32, и кто знает, какое имя она будет иметь в следующей версии Windows. В таких и многих других случаях выручат API-функции: GetWindowsDirectory и GetSystemDirectory. Они обе принимают в качестве параметров строковый буфер и его длину и возвращают количество символов, записанных в переданный буфер, или 0 в случае ошибки.

Для этих функций удобно реализовывать функции-оболочки, работающие со стандартными для Delphi строками, что, собственно, и сделано при написании этой главы (все реализованные функции вы можете найти в модуле PathFunctions, расположенном на диске, прилагаемом к книге, в папке с названием подраздела). Итак, функция определения папки Windows приведена в листинге 4.11.

...

Листинг 4.11.

Определение папки WINDOWS

function GetWinDir(): String;

var

buffer: String;

len: UINT;

begin

SetLength(buffer, MAX_PATH + 1);

len := GetWindowsDirectory(PAnsiChar(buffer), MAX_PATH);

SetLength(buffer, len);

GetWinDir := buffer;

end;

По аналогии реализуется функция определения расположения системной папки, только вместо GetWindowsDirectory вызывается фyнкцияGetSystemDirectory.

Имена для временных файлов

Для централизованного хранения временных данных, необходимых при работе приложений, в Windows предусмотрена специальная папка Temp. Ее расположение может варьироваться. Причем в многопользовательских версиях Windows (NT, 2000, ХР) местоположение папки для временных файлов может быть различным для различных пользователей. Итак, расположение папки Temp поможет определить API-функция GetTempPath. Она принимает следующие параметры: строковый буфер и длину этого буфера. Возвращает количество символов, записанных в переданную строку, или 0, если возникла ошибка. Функция-оболочка, скрывающая работу со строковым буфером и преобразование типов, реализуется аналогично двум ранее рассмотренным функциям (листинг 4.12).

...

Листинг 4.12.

Определение расположения папки для временных файлов

function GetTempDir(): String;

var

buffer: String;

len: UINT;

begin

SetLength(buffer, MAX_PATH + 1);

len := GetTempPath(MAX_PATH, PAnsiChar(buffer));

SetLength(buffer, len);

GetTempDir := buffer;

end;

Кроме того, Windows API предусматривает очень полезную функцию, избавляющую программиста от необходимости подбирать имена временных файлов так, чтобы они были уникальными в пределах заданной папки (это не обязательно должна быть папка Temp ). Имя этой функции – GetTempFileName. Пример ее использования приведен в листинге 4.13.

...

Листинг 4.13.

Определение имени временного файла

function GetTempFile(prefix: String = \'~mytmp\'): String;

var

buffer, dir: String;

begin

dir := GetTempDir();

//Получение имени временного файла (система сама определяет

имя,

//уникальное для заданной папки)

SetLength(buffer, MAX_PATH + 1);

GetTempFileName(PAnsiChar(dir), PAnsiChar(prefix), 0,

PAnsiChar(buffer));

GetTempFile := buffer;

end;

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

Кроме пути папки, в которой необходимо создать временный файл, функция GetTempFileName принимает строку-префикс для имени временного файла и целочисленное значение (третий параметр). Если третий параметр не равен нулю, то его значение в шестнадцатеричной форме просто прибавляется справа к строке prefix. Никаких проверок на уникальность получившегося имени файла при этом не производится. Если же третий параметр установить в 0, то система сама сформирует шестнадцатеричное значение так, чтобы имя файла было уникальным в заданной папке. Кроме того, при этом создается и сам файл.

Буфер (последний параметр функции GetTempFileName) должен вмещать как минимум МАХРАТН символов, так как функция записывает в него полный путь временного файла.

Пример работы функций определения папки для временных файлов, получения имени для временного файла, а также определения системных папок Windows приводится на рис. 4.2.

Валерий Борисок, Юрий Корвель и др. - Delphi. Трюки и эффекты

Рис. 4.2. Папки WINDOWS, system, Temp и имя для временного файла

Прочие системные пути

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

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf epub ios.epub fb3 azw3