Delphi проверка наличия диска
При работе с файловой системой первым делом, как правило, необходимо определить конфигурацию системы, т.е. какие диски и каких типов установлены на компьютере. Это можно определить при помощи функции GetLogicalDrivers:
При удачном завершении функция возвращает 32-х битовое значение, каждый бит которого указывает, существует ли соответствующее логическое устройство: бит 0 - диск А, бит 1 - диск B, бит 2 - диск С …. бит 25 - диск Z. При неудачном завершении функция возвращает ноль.
Для получения информации о томах системы используется функция GetVolumeInformation, которая возвращает информацию, специфичную для файловой системы, связанной с каталогом, указанным первым параметром функции, остальные параметры - указатели на буферы и переменные типа DWORD:
Первый аргумент - 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 | Тип устройства определить не удалось. | |
DRIVE_NO_ROOT_DIR | Корневого каталога не существует. | |
DRIVE_REMOVABLE | Устройство со сменным носителем (гибкий диск). | |
DRIVE_FIXED | Устройство с несменным носителем (жесткий диск). | |
DRIVE_REMOTE | Удаленное устройство (сетевой диск). | |
DRIVE_CDROM | CDROM. | |
DRIVE_RAMDISK | RAM-диск. |
Функция GetDiskFreeSpace возвращает статистику о дисковом пространстве на указанном томе:
Первый аргумент - lpRootPathName - является указателем на корневой каталог файловой системы, информацию о которой мы хотим получить. Если этот параметр равен NULL, то используется текущий каталог диска.
Во втором аргументе - lpSectorsPerCluster – функция возвращает число секторов в кластере.
В третьем аргументе - lpBytesPerSector – функция возвращает количество байт в секторе.
В четвертом аргументе - lpNumberOfFreeClusters – функция возвращает количество свободных кластеров на диске.
В пятом аргументе - lpTotalNumberOfClusters – функция возвращает общее количество кластеров на диске.
Выполнение работы
К п.1. После создания нового проекта, можно приступить к разработке приложения, внешний вид основного окна которого приведен на рис. 6.
рис. 6 Внешний вид основного окна приложения
К п.2. После размещения на форме компонента TComboBox, создайте обработчик события OnCreate формы и добавьте туда код для формирования списка о дисках и логических томах, присутствующих в системе:
procedure TForm1.FormCreate(Sender: TObject);
var mask,LogDrives,i: DWORD;
if (mask and LogDrives) <> 0
К п.3. Для отображения информации о выбранном в компоненте ComboBox1 диске или логическом томе, вначале разместите на форме компонент StringGrid1.
Для отображения информации о выбранном диске используются возвращаемые параметры функций GetVolumeInformation, GetDiskFreeSpace и GetDriveType. Кроме того, необходимо определить производные параметры такие как: количество занятых кластеров на диске, и количество свободной, занятой и общей памяти подсчитанной в байтах. Поэтому в раздел public класса TForm1 добавьте следующие переменные:
Теперь добавьте в ранее созданный обработчик события OnCreate формы код для вывода названий параметров диска в соответствии с описаниями тех же функций:
procedure TForm1.FormCreate(Sender: TObject);
var mask,LogDrives,i: DWORD;
// определение имеющихся в системе дисков
for i:=0 to high(InfoDrive) do
StringGrid1.Cells[0,i]:=InfoDrive[i]; // массив строк
Здесь же выделяется динамическая память (функция GetMem) для хранения строк имен тома, серийного номера тома и имени файловой системы.
Для обновления информации в таблице параметров после выбора нового диска необходимо создать обработчик события OnChange компонента Combobox1, в котором и будет осуществляться запрос информации о выбранном диске:
Начиная с версии 2009, в Delphi на уровне языка и компилятора появилась поддержка универсальных типов или дженериков (известных также как параметризованные типы), аналога шаблонов в C++. Вместе с этими изменениями появился юнит System.Generics.Collections, служащий для работы с массивами и группировки данных в словари, списки, стеки и очереди. Именно об этом юните и о работе с ним пойдёт здесь речь.
Статья рассчитана на читателей, имеющих представление о том, что такое универсальный тип или шаблон. Здесь я буду рассматривать только использование юнита System.Generics.Collections. Будут рассмотрены основные классы, которые в нём реализованы, и даны примеры использования. Все приведённые примеры сделаны для Delphi XE7 и их работоспособность в других версиях Delphi не гарантируется.
Использование TDirectory
Структура TDirectory используется в Delphi для работы с директориями. Она содержит только статические методы. Давайте рассмотрим их.
TArray
Класс TArray юнита System.Generics.Collections содержит статические методы для поиска (BinarySearch) и сортировки массива (Sort). При поиске с помощью функции BinarySearch используется бинарный поиск с использованием O(log n) алгоритма, где n - количество элементов массива. Давайте рассмотрим пример использования класса TArray.
Обратите внимание, что универсальный тип для массива (TArray ) определён в юните System, а в юните System.Generics.Collections определён лишь вспомогательный класс, который может только сортировать массив и искать в нём.
Теперь рассмотрим вариант сортировки с использованием своего компаратора (сравнивателя). Допустим, что в примере нам нужно сортировать строки не по алфавиту, а по своему собственному алгоритму.
TList и TObjectList
Список TList или TObjectList – это упорядоченный список, доступ к элементам которого происходит по индексу. Разница между этими классами в том, что второй класс умеет автоматически удалять экземпляры элементов при их удалении из списка.
В список можно добавлять или вставлять элементы, менять и удалять их. Можно добавлять nil. При изменении списка срабатывает событие OnNotify.
Список можно сортировать, используя стандартные или свои компараторы. Можно искать в нём и делать реверсию.
Свойство Count показывает количество элементов в списке, а Capacity – количество зарезервированных мест. Прочитать элемент по индексу можно с помощью свойства Items.
Вот пример использования объекта TList.
Использование объекта TObjectList очень похоже, поэтому я лишь покажу пример, который покажет дополнительные тонкие моменты.
TStack и TObjectStack
Стек TStack или TObjectStack – это стек элементов, работающий по принципу «последним пришёл — первым вышел» (last in - first out). Т.е. добавленные в стек элементы, вытаскиваются из него в обратном порядке. Стеки TStack и TObjectStack отличаются друг от друга тем, что второй стек предоставляет механизм автоматического удаления объектов удаляемых из стека.
Стек может быть произвольного размера. В стек можно добавлять nil. При изменении стека срабатывает событие OnNotify. Свойство Count показывает общее количество элементов в стеке.
Пример использования стека TStack.
Использование стека TObjectStack аналогичное и рассматривать его я здесь не буду. Упомяну лишь, что здесь можно использовать метод Extract, вместо Pop, если не требуется автоматическое удаление извлекаемого элемента.
Получение цели из символической ссылки
Чуть выше мы упоминали работу с символической ссылкой, а теперь разберёмся, как узнать, на что ссылается символическая ссылка. Для этого у структуры TFile есть две функции с именем GetSymLinkTarget. Вот пример:
Специальные символы
При составлении путей к файлам и директориям используются определённые специальные символы, которые могут быть разными в разных операционных системах. Чтобы не ломать голову и не гадать, какие символы для чего нужно использовать, мы можем узнать это у структуры TPath с помощью следующих статических свойств:
- DirectorySeparatorChar – символ для разделения директорий разного уровня;
- AltDirectorySeparatorChar – альтернативный символ для разделения директорий разного уровня;
- ExtensionSeparatorChar – символ для разделения имени от расширения в имени файла;
- PathSeparator – символ для разделения путей в переменных окружения;
- VolumeSeparatorChar – символ для отделения буквы диска от остального пути.
Вот пример, с выводом значений всех свойств TPath:
Ещё несколько функций для того, чтобы открыть файл
Теперь рассмотрим ещё на несколько удобных функций для открытия файла. Это функции AppendText, OpenText, Open, OpenRead, OpenWrite.
Функции AppendText и OpenText предназначены для работы с текстовыми файлами в кодировке UTF-8. AppendText открывает файл, или создаёт новый файл, если его не было, для добавления в него текста, а OpenText – для чтения из текстового файла. Функция AppendText для работы с файлом, создаёт и возвращает объект TStreamWriter, который после использования нужно удалить. Функция OpenText для чтения текста создаёт и возвращает объект TStreamReader, который после использования также нужно удалить.
Функции Open, OpenRead, OpenWrite по сути просто создают объект TFileStream и возвращают его. Функция OpenRead открывает файл на чтение, функция OpenWrite — на запись, а функция Open может, как создавать файлы, так и открывать их в различных режимах и с различными привилегиями.
Рассмотрим примеры использования этих функций:
Создание и удаление файла
Для создания файла у структуры TFile есть несколько методов:
- Create – создаёт пустой файл и возвращает ассоциированный с ним поток (экземпляр TFileStream), в который сразу можно записывать какие-либо данные.
- CreateText – создаёт пустой файл и возвращает экземпляр объекта TStreamWriter для записи текста в файл.
- CreateSymLink – создаёт символическую ссылку (которая, по сути, тоже является файлом) для папки или файла. Обратите внимание, что для создания символической ссылки, ваше приложение должно выполняться с правами администратора.
Для удаления файла есть функция Delete.
Использование TPath
Структура TPath используется в Delphi для работы с путями. Она содержит только статические методы и свойства. Давайте рассмотрим их.
TThreadList
TThreadList – это тоже список, но потокобезопасный, т.е. с ним можно смело работать сразу из нескольких потоков. На самом деле – это обёртка над классом TList. Набор методов для работы с элементами здесь очень скромный: Add (добавление элемента), Clear (очистка списка), Remove (удаление элемента) и RemoveItem (удаление элемента с указанием направления поиска). А чтобы работать со списком в полную силу (чтение всех элементов, поиск, сортировка), нужно получить доступ к списку TList, который хранится внутри TThreadList. Сделать это можно с помощью функции блокировки LockList, которая заблокирует список и вернёт указатель на список TList. После работы со списком TList, список нужно разблокировать с помощью метода UnlockList. Также здесь есть очень полезное свойство Duplicates (дубликаты), которое задаёт поведение списка при добавлении дубликатов: разрешать добавление дубликатов (dupAccept), игнорировать дубликаты, не добавляя их, (dupIgnore) или генерировать ошибку при добавлении дубликата (dupError). По умолчанию свойство Duplicates имеет значение dupIgnore.
Вот пример работы со списком TThreadList (для создания потоков я использую класс TTask, о котором я уже рассказывал в статье «Параллельное программирование в Delphi XE7»).
Шифрование и расшифровывание файлов
Шифрование и расшифровывание файла можно сделать с помощью, соответственно, методов Encrypt и Decrypt. После шифрования вы сможете работать с файлом как и раньше. Всю работу по чтению из зашифрованного файла, запись в него и т.д. берёт на себя операционная система. Вот пример использования функций.
Копирование, перемещение и переименование файлов
Для копирования файла у структуры TFile есть метод Copy, а для перемещения или переименования – метод Move.
Метод Copy кидает ошибку, если файл с таким же именем, как файл назначения существует. Однако вы можете установить третий параметр метода Overwrite в true, и тогда операция копирования всё равно выполнится.
Кроме вышеуказанного случая метод Copy кидает ошибку, если файл, который вы хотите копировать, не существует, неверно указан путь или пользователь не имеет достаточных привилегий для копирования файла в указанное место.
Метод Move кидает ошибку, если файл назначения существует.
Вот пример использования методов Copy и Move:
Проверка существования файла
Так же как и у TDirectory у структуры TFile есть функция Exists. Первый параметр функции – это путь к файлу. Второй необязательный параметр FollowLink учитывается только при использовании символической ссылки. Если нужно проверить только существование символической ссылки на файл, то нужно установить этот параметр в false, а если нужно проверить наличие всего сразу, т.е. и символической ссылки на файл и самого файла, то нужно установить этот параметр в true. Вот примеры использования:
Работа с путями директорий
Путь, который определяет местоположение директории, может сказать о многом. Из него, например, можно получить корневую директорию с помощью функции GetDirectoryRoot. В нём можно найти все родительские директории с помощью рекурсивного вызова функции GetParent. Иногда путь может быть относительным, что вы сможете легко проверить с помощью функции IsRelativePath.
Дополнительно может пригодиться функция GetLogicalDrives, возвращающая список всех логических дисков на компьютере.
Вот примеры использования этих функций:
TThreadedQueue
TThreadedQueue - это ещё одна реализация очереди, но в отличие от TQueue или TObjectQueue, эта очередь предназначена для вставки и изъятия элементов из разных потоков. Для этой очереди задаётся ограничение на максимальное количество находящихся в ней элементов, и, если очередь максимально заполнена и какой либо поток пытается добавить ещё один элемент, то этот поток ожидает, пока в очереди появится свободное место или пока не истечёт время ожидания.
Вот пример использования очереди TThreadedQueue (для создания потоков я использую класс TTask, о котором я уже рассказывал в статье «Параллельное программирование в Delphi XE7»):
А вот результат, который будет выведен на консоль:
Если будете плотно использовать этот класс, то вам может пригодиться ещё функция DoShutDown, которая объявляет, что очередь остановлена (после вызова этой функции новые элементы в очередь не добавляются, т.е. при вызове метода PushItem ничего не происходит), и свойство ShutDown, с помощью которого вы можете проверить, остановлена очередь или нет. Здесь нужно заметить, что после остановки очереди вы всё равно сможете считать попавшие туда элементы.
Проверка существования директории
Чтобы проверить, существует ли директория, у структуры TDirectory есть функция Exists. Первый параметр функции – это путь к директории. Второй необязательный параметр FollowLink учитывается только при использовании символической ссылки. Если нужно проверить только существование символической ссылки на директорию, то нужно установить этот параметр в false, а если нужно проверить наличие всего сразу, т.е. и символической ссылки на директорию и самой директории, то нужно установить этот параметр в true. Вот примеры использования:
TArray
Класс TArray юнита System.Generics.Collections содержит статические методы для поиска (BinarySearch) и сортировки массива (Sort). При поиске с помощью функции BinarySearch используется бинарный поиск с использованием O(log n) алгоритма, где n - количество элементов массива. Давайте рассмотрим пример использования класса TArray.
Обратите внимание, что универсальный тип для массива (TArray ) определён в юните System, а в юните System.Generics.Collections определён лишь вспомогательный класс, который может только сортировать массив и искать в нём.
Теперь рассмотрим вариант сортировки с использованием своего компаратора (сравнивателя). Допустим, что в примере нам нужно сортировать строки не по алфавиту, а по своему собственному алгоритму.
Получение списка файлов и поддиректорий в директории
Чтобы получить список всех файлов и поддиректорий, находящихся внутри какой-либо директории у структуры TDirectory есть методы GetFiles, GetDirectories и GetFileSystemEntries. Метод GetFiles возвращает только файлы, метод GetDirectories – только поддиректории, метод GetFileSystemEntries возвращает и файлы и директории. Каждый из этих методов поддерживает шаблоны поиска и фильтры и может работать рекурсивно.
Кроме того здесь стоит упомянуть и о функции IsEmpty, которая проверяет, пустая директория или нет.
Вот примеры использования методов GetFiles, GetDirectories, GetFileSystemEntries и IsEmpty:
TQueue и TObjectQueue
Очередь TQueue или TObjectQueue позволяет вам добавлять элементы в конец, а вытаскивать их из начала. Т.е. из очереди элементы будут считываться в том же порядке, в котором они были туда добавлены. Разница между очередями TQueue или TObjectQueue состоит в том, что очередь TObjectQueue умеет автоматически удалять объекты при удалении элементов из очереди.
Свойство Count показывает количество элементов в очереди. При добавлении или удалении элемента вызывается событие OnNotify. В очередь можно добавлять nil.
Вот пример использования очереди TQueue.
Использование стека TObjectQueue аналогичное и рассматривать его я здесь не буду. Здесь, так же как и в классах TObjectList и TObjectStack, можно использовать метод Extract вместо метода Dequeue, если не требуется автоматическое удаление извлекаемого элемента.
Функции удобной записи в файл и чтения из него
У структуры TFile есть очень удобные методы, позволяющие делать запись в файл и чтение из него, всего в одну строчку. Вот эти методы:
- WriteAllBytes – записывает массив байт в файл. Если указанный файл существует, то он будет перезаписан.
- WriteAllLines – записывает все строки из массива строк в файл. Если указанный файл существует, то он будет перезаписан. Метод умеет конвертировать записываемый текст в нужную кодировку. Если указана кодировка и она не ANSI, то метод записывает маркер последовательности байтов (BOM).
- WriteAllText – записывает одну строку в файл. Если указанный файл существует, то он будет перезаписан. Метод умеет конвертировать записываемый текст в нужную кодировку. Также метод умеет записывать маркер последовательности байтов (BOM).
- AppendAllText – добавляет текст в конец файла. Если файла нет, то он будет создан.
- ReadAllBytes – считывает файл в новый массив байт.
- ReadAllLines – считывает все строки из файла в массив строк. Метод умеет считывать текст в заданной кодировке.
- ReadAllText – считывает весь текст из файла. Метод умеет считывать текст в заданной кодировке.
Вот примеры использования методов WriteAllText, ReadAllText и AppendAllText:
Вот примеры использования методов WriteAllLines, ReadAllLines и AppendAllText:
А вот примеры использования функций WriteAllBytes и ReadAllBytes:
TDictionary и TObjectDictionary
Словарь TDictionary или TObjectDictionary – это коллекция пар ключ-значение. Разница между этими двумя классами в том, что второй класс умеет автоматически удалять экземпляры ключей-объектов и/или значений-объектов, т.е. вы можете использовать в качестве ключей или значений экземпляры объектов.
Добавить ключ с соответствующим значением в словарь вы можете с помощью методов Add (вернёт ошибку, если попытаться добавить ключ повторно) или AddOrSetValue (заменит значение для ключа, если ключ уже есть в коллекции). Удалять элементы словаря можно с помощью Remove (удаление одного элемента) и Clear (полная очистка словаря). Полезными могут быть события OnKeyNotify и OnValueNotify, которые происходят при добавлении, изменении или удалении пары (следует учитывать, что для одной операции может произойти несколько событий).
Добавление или удаление пары ключ-значение, а также чтение значения по ключу являются эффективными, близкими к O (1), т.к. для хранения пар используется хэш-таблица. Ключи не могут быть nil, а значения – могут.
Узнать наличие в словаре ключа или значения можно с помощью методов TryGetValue (пытается считать значение по ключу), ContainsKey (проверяет наличие ключа) и ContainsValue (проверяет наличие значения). Прочитать значение по ключу можно с помощью свойства Items, узнать количество пар в словаре – с помощью свойства Count. Получить список всех ключей можно из свойства Keys, а значений – из свойства Values.
Рассмотрим несколько вариантов использования словарей.
Теперь рассмотрим более сложный вариант, когда в качестве ключа используется экземпляр класса. Также определим для ключа свой компаратор (сравниватель).
Получение и изменение текущей директории приложения
Кроме всего вышеперечисленного у структуры TDirectory есть функции для получения и изменения текущей директории приложения: GetCurrentDirectory и SetCurrentDirectory. Вот примеры использования:
Получение путей к специальным и пользовательским директориям
В каждой современной операционной системе есть директории для хранения документов, видео, музыки и т.п. Кроме того есть разнообразные специальные директории для хранения системных библиотек, временных файлов и т.п. Это сделано для удобства пользователей и разработчиков, а также для поддержания порядка. Для получения путей к таким директориям у структуры TPath есть следующие функции:
Загрузка. Пожалуйста,
подождите.Репутация: 2
Всего: 4Подскажите пожалуйста, как получить информацию о том, какие установлены жесткие диски, и какие метки драйвов им соответствуют?
Репутация: нет
Всего: 1Вот пример, как определить, существует ли диск в системе:
Теперь об информации о дисках:
исчерпывающую информацию по этому поводу дает функция GetVolumeInformation,
посмотри help, там все понятно (там и серийный номер диска, и тип файловой системы, и прочее и прочее).Вот параметры FileSysFlags:
FS_CASE_IS_PRESERVED - (при записи на диск сохраняется регистр букв в его имени)
FS_CASE_SENSITIVE - (поддерживается поиск файлов с учетом регистра букв)
FS_UNICODE_STORED_ON_DISK - (поддерживается сохранение имен файлов в UniCode)
FS_PERSISTENT_ACLS - (поддерживаются списки контроля доступа (ACL). Только для NTFS)
FS_FILE_COMPRESSION - (поддерживается сжатие файлов на уровне системы)
FS_VOL_IS_COMPRESSED - (устройство представляет собой сжатый диск)Определение типа диска:
Репутация: 2
Всего: 4serious, спасибо! Но это все относится к драйву (логическому диску), а не к жесткому диску. Мне нужна информация именно о жеском диске, и о связи его с логическим.
Репутация: нет
Всего: 118Посмотри функцию DeviceIoControl - может там что получиться. Я ее мало использовал, но что-то там было.
Там есть ссылка на CreateFile - эта функция под NT может действительно вернуть хэндл на физический диск.
You can use the CreateFile function to open a disk drive or a partition on a disk drive. The function returns a handle to the disk device; that handle can be used with the DeviceIOControl function.
Репутация: нет
Всего: 1Что-то не совсем понял вопрос: тебе нужна информация типа серийный номер, объем диска, кластеры. Так что ли? Поясни конкретнее.
Репутация: 14
Всего: 154Получение информации о любом диске.
Работает на FDD, HDD, CD, другие не пробовал.Создайте модуль с именем HDDInfo и полностью скопируйте в него весь текст.
Зависимости: Все Windows (32S,95,NT)
Автор: cyborg, [email protected], ICQ:114205759, Бузулук
Copyright: Собственное написание (Осипов Евгений Анатольевич)
Дата: 23 мая 2002 г.
***************************************************** >
function GetDisks(TypeOfDisk : Word) : String;Получаемые значения:
VolumeName - Метка/Имя тома
FileSystemName - Файловая система
VolumeSerialNo - Серийный номер диска (можно привязывать к диску программы)
MaxComponentLength - Максимальная длинна имени файла
FileSystemFlags - Флаги смотрите в справке Delphi по GetVolumeInformationФункция возвращает true, если всё прошло успешно (диск нашёлся),
и false, если возникли проблемы, например диска нет в дисководе,
либо дисковода такого вообще нет
>
Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String;
Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean;function GetDisks(TypeOfDisk : Word) : String;
var
DriveArray : array[1..26] of Char;
I : integer;
begin
DriveArray:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
for I := 1 to 26 do
if GetDriveType(PChar(DriveArray[I]+':\')) = TypeOfDisk then Result := Result+DriveArray[I];
end;Репутация: 2
Всего: 4AntonSaburov, спасибо, посмотрю!
Pegas, но это все относится к логическим дискам.
serious, типа этого.
Например у меня есть 2 жестких диска, один Maxtor объемом 20 Gb и второй WD объемом 15Gb. Первый (Maxtor) разбила на 3 патиции: C, D, E соответственно 10Gb, 4Gb, 6Gb. Второй оставила с одной патицией F. Тем кодом, который привел serious и Pegas, можно получить информацию о том, что у меня в системе есть логические диски C, D, E, F их серийные номера, их объем. А у меня задача узнать сколько винчестеров у меня стоит, т.е. узнать о том, что у меня стоит 2 винчестера. Какие они, т.е., что это Maxtor и WD. Какой у них объем, т.е., что 20Gb и 15Gb. И на какие они патиции (логические диски) разбиты. А уже информацию по логическим дискам можно получить кодом приведенным выше Pegasом и seriousом.
Чтобы совсем было понятно: зайдите в Control Panel - Administrative tools - Computer management - Storage - Disk management. Вот в таком виде информацию.
Репутация: 2
Всего: 4Репутация: нет
Всего: 118Цитата(Dayana @ 13.3.2003, 00:36) AntonSaburov, похоже, это то, что мне надо. Спасибо! :-)
Ну, я, это, типа, завсегда, мы ж понимаем .
ВотРепутация: 2
Всего: 4AntonSaburov, только это работает для NT, а для 95/98 не работает. :-(
Есть ли какой-нибудь способ добраться до информации BIOSа? (для всех систем) Ведь BIOS видит диски.Репутация: нет
Всего: 1А что конкретно под NT не работает? Все? Попробую под XP это сделать, если не пойдет, то будем думать дальше.
Репутация: нет
Всего: 118Цитата только это работает для NT, а для 95/98 не работает. :-( Я уже очень давно не работаю под такими ОС - предпочитаю с ними не связываться.
Так что здесь мало что могу посоветовать.Но с другой стороны эти ОС дырявые и можно что-то с прямым доступом к памяти поискать.
Репутация: 2
Всего: 4serious, для NT все работает. Читай внимательнее.
AntonSaburov, у меня просто задача для разных ОС. Поискать можно. вот и ищу. :-)
Репутация: нет
Всего: 1Цитата(Dayana @ 13.3.2003, 15:39) Есть ли какой-нибудь способ добраться до информации BIOSа? (для всех систем) Ведь BIOS видит диски.
Assembler?
ЗЫ А вообще, посмотри, не равен ли у тебя 0 дескриптор винта.
Репутация: нет
Всего: 1Цитата(Dayana @ 13.3.2003, 15:39) AntonSaburov, только это работает для NT, а для 95/98 не работает. :-(
Если ничего не путаю, там немного другой способ получения дескриптора.
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) 0 Пользователей: « Предыдущая тема | Delphi: Общие вопросы | Следующая тема »
[ Время генерации скрипта: 0.1452 ] [ Использовано запросов: 22 ] [ GZIP включён ]
Копирование, перемещение и переименование директории
Для копирования директории у структуры TDirectory есть метод Copy, а для перемещения или переименования – метод Move. Перечисленные выше операции производятся с директорией в целом, включая вложенные директории и файлы.
Если директория, в которую происходит копирование, уже существует, то произойдёт слияние существующей директории и директории, которую вы копируете. При этом совпадающие файлы в директории назначения будут удалены, а вместо них будут скопированы файлы из директории источника.
Вот пример использования методов Copy и Move:
Чтение и изменение характеристик файла
В структуре TFile для чтения и изменения характеристик файла есть следующие методы:
- GetAttributes – возвращает атрибуты файла, такие как «только чтение», «системный», «скрытый» и т.п.;
- SetAttributes – устанавливает новый набор атрибутов для файла, такие как «только чтение», «системный», «скрытый» и т.п.;
- GetCreationTime и GetCreationTimeUtc – возвращают дату и время создания файла;
- SetCreationTime и SetCreationTimeUtc – устанавливают дату и время создания файла;
- GetLastAccessTime и GetLastAccessTimeUtc – возвращают дату и время последнего обращения к файлу;
- SetLastAccessTime и SetLastAccessTimeUtc – устанавливают дату и время последнего обращения к файлу;
- GetLastWriteTime и GetLastWriteTimeUtc – возвращают дату и время последней записи в файл.
- SetLastWriteTime и SetLastWriteTimeUtc – устанавливают дату и время последней записи в файл.
Функции, возвращающие и устанавливающие время, в конце имени которых есть суффикс «Utc», возвращают время в формате всемирного координированного времени (UTC).
Кроме приведённых здесь функций есть ещё недокументированные статические функции IntegerToFileAttributes и FileAttributesToInteger. Первая конвертирует атрибуты операционной системы для файла или директории в атрибуты, описанные в перечислении TFileAttribute, а вторая — обратно.
Использование TFile
Структура TFile используется в Delphi для работы с файлами. Она содержит только статические методы. Давайте рассмотрим их.
Чтение и изменение характеристик директории
В структуре TDirectory для чтения и изменения характеристик директории есть следующие методы:
- GetAttributes – возвращает атрибуты папки, такие как «только чтение», «системная», «скрытая» и т.п.;
- SetAttributes – устанавливает новый набор атрибутов директории, такие как «только чтение», «системная», «скрытая» и т.п.;
- GetCreationTime и GetCreationTimeUtc – возвращают дату и время создания директории;
- SetCreationTime и SetCreationTimeUtc – устанавливают дату и время создания директории;
- GetLastAccessTime и GetLastAccessTimeUtc – возвращают дату и время последнего обращения к директории;
- SetLastAccessTime и SetLastAccessTimeUtc – устанавливают дату и время последнего обращения к директории;
- GetLastWriteTime и GetLastWriteTimeUtc – возвращают дату и время последней записи в директорию.
- SetLastWriteTime и SetLastWriteTimeUtc – устанавливают дату и время последней записи в директорию.
Функции, возвращающие и устанавливающие время, в конце имени которых есть суффикс «Utc», возвращают время в формате всемирного координированного времени (UTC).
Теперь рассмотрим примеры:
И в заключении об использовании стандартных дженериков Delphi.
. можно сказать следующее. Рассмотренные в статье дженерики или универсальные типы очень сильно облегчают программирование. Ведь массивы, списки и словари используются в программировании постоянно. А при использовании дженериков вы облегчаете читабельность кода. Кроме того ошибки несоответствия добавляемых типов в такие словари или списки отлавливаются ещё на этапе компиляции. Кроме того каждый из рассмотренных классов специально оптимизирован для выполнения возложенной на него задачи. Так, что если вы ещё не используете дженерики, настала пора это сделать.
Загрузка. Пожалуйста,
подождите.Репутация: 2
Всего: 4Подскажите пожалуйста, как получить информацию о том, какие установлены жесткие диски, и какие метки драйвов им соответствуют?
Репутация: нет
Всего: 1Вот пример, как определить, существует ли диск в системе:
Теперь об информации о дисках:
исчерпывающую информацию по этому поводу дает функция GetVolumeInformation,
посмотри help, там все понятно (там и серийный номер диска, и тип файловой системы, и прочее и прочее).Вот параметры FileSysFlags:
FS_CASE_IS_PRESERVED - (при записи на диск сохраняется регистр букв в его имени)
FS_CASE_SENSITIVE - (поддерживается поиск файлов с учетом регистра букв)
FS_UNICODE_STORED_ON_DISK - (поддерживается сохранение имен файлов в UniCode)
FS_PERSISTENT_ACLS - (поддерживаются списки контроля доступа (ACL). Только для NTFS)
FS_FILE_COMPRESSION - (поддерживается сжатие файлов на уровне системы)
FS_VOL_IS_COMPRESSED - (устройство представляет собой сжатый диск)Определение типа диска:
Репутация: 2
Всего: 4serious, спасибо! Но это все относится к драйву (логическому диску), а не к жесткому диску. Мне нужна информация именно о жеском диске, и о связи его с логическим.
Репутация: нет
Всего: 118Посмотри функцию DeviceIoControl - может там что получиться. Я ее мало использовал, но что-то там было.
Там есть ссылка на CreateFile - эта функция под NT может действительно вернуть хэндл на физический диск.
You can use the CreateFile function to open a disk drive or a partition on a disk drive. The function returns a handle to the disk device; that handle can be used with the DeviceIOControl function.
Репутация: нет
Всего: 1Что-то не совсем понял вопрос: тебе нужна информация типа серийный номер, объем диска, кластеры. Так что ли? Поясни конкретнее.
Репутация: 14
Всего: 154Получение информации о любом диске.
Работает на FDD, HDD, CD, другие не пробовал.Создайте модуль с именем HDDInfo и полностью скопируйте в него весь текст.
Зависимости: Все Windows (32S,95,NT)
Автор: cyborg, [email protected], ICQ:114205759, Бузулук
Copyright: Собственное написание (Осипов Евгений Анатольевич)
Дата: 23 мая 2002 г.
***************************************************** >
function GetDisks(TypeOfDisk : Word) : String;Получаемые значения:
VolumeName - Метка/Имя тома
FileSystemName - Файловая система
VolumeSerialNo - Серийный номер диска (можно привязывать к диску программы)
MaxComponentLength - Максимальная длинна имени файла
FileSystemFlags - Флаги смотрите в справке Delphi по GetVolumeInformationФункция возвращает true, если всё прошло успешно (диск нашёлся),
и false, если возникли проблемы, например диска нет в дисководе,
либо дисковода такого вообще нет
>
Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String;
Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean;function GetDisks(TypeOfDisk : Word) : String;
var
DriveArray : array[1..26] of Char;
I : integer;
begin
DriveArray:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
for I := 1 to 26 do
if GetDriveType(PChar(DriveArray[I]+':\')) = TypeOfDisk then Result := Result+DriveArray[I];
end;Репутация: 2
Всего: 4AntonSaburov, спасибо, посмотрю!
Pegas, но это все относится к логическим дискам.
serious, типа этого.
Например у меня есть 2 жестких диска, один Maxtor объемом 20 Gb и второй WD объемом 15Gb. Первый (Maxtor) разбила на 3 патиции: C, D, E соответственно 10Gb, 4Gb, 6Gb. Второй оставила с одной патицией F. Тем кодом, который привел serious и Pegas, можно получить информацию о том, что у меня в системе есть логические диски C, D, E, F их серийные номера, их объем. А у меня задача узнать сколько винчестеров у меня стоит, т.е. узнать о том, что у меня стоит 2 винчестера. Какие они, т.е., что это Maxtor и WD. Какой у них объем, т.е., что 20Gb и 15Gb. И на какие они патиции (логические диски) разбиты. А уже информацию по логическим дискам можно получить кодом приведенным выше Pegasом и seriousом.
Чтобы совсем было понятно: зайдите в Control Panel - Administrative tools - Computer management - Storage - Disk management. Вот в таком виде информацию.
Репутация: 2
Всего: 4Репутация: нет
Всего: 118Цитата(Dayana @ 13.3.2003, 00:36) AntonSaburov, похоже, это то, что мне надо. Спасибо! :-)
Ну, я, это, типа, завсегда, мы ж понимаем .
ВотРепутация: 2
Всего: 4AntonSaburov, только это работает для NT, а для 95/98 не работает. :-(
Есть ли какой-нибудь способ добраться до информации BIOSа? (для всех систем) Ведь BIOS видит диски.Репутация: нет
Всего: 1А что конкретно под NT не работает? Все? Попробую под XP это сделать, если не пойдет, то будем думать дальше.
Репутация: нет
Всего: 118Цитата только это работает для NT, а для 95/98 не работает. :-( Я уже очень давно не работаю под такими ОС - предпочитаю с ними не связываться.
Так что здесь мало что могу посоветовать.Но с другой стороны эти ОС дырявые и можно что-то с прямым доступом к памяти поискать.
Репутация: 2
Всего: 4serious, для NT все работает. Читай внимательнее.
AntonSaburov, у меня просто задача для разных ОС. Поискать можно. вот и ищу. :-)
Репутация: нет
Всего: 1Цитата(Dayana @ 13.3.2003, 15:39) Есть ли какой-нибудь способ добраться до информации BIOSа? (для всех систем) Ведь BIOS видит диски.
Assembler?
ЗЫ А вообще, посмотри, не равен ли у тебя 0 дескриптор винта.
Репутация: нет
Всего: 1Цитата(Dayana @ 13.3.2003, 15:39) AntonSaburov, только это работает для NT, а для 95/98 не работает. :-(
Если ничего не путаю, там немного другой способ получения дескриптора.
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) 0 Пользователей: « Предыдущая тема | Delphi: Общие вопросы | Следующая тема »
[ Время генерации скрипта: 0.1465 ] [ Использовано запросов: 22 ] [ GZIP включён ]
Начиная с версии XE2 в Delphi появился юнит System.IOUtils, включающий удобные утилиты для работы с файлами и директориями. Предлагаю вместе подробно разобраться с тем, что в юните System.IOUtils имеется и попробовать на примерах как это всё работает.
Замена содержимого файла
У структуры TFile есть метод Replace, позволяющий заменить содержимое файла на содержимое другого файла. По сути, происходит замена одного файла на другой, но при замене сохранятся все атрибуты файла, содержимого которого мы меняем. Атрибуты копируются следующие: время создания, краткое название файла, идентификатор объекта, дискреционный список контроля доступа (DACL), атрибуты безопасности, шифрование, сжатие и именованные потоки (не в заменяемом файле). Однако вы можете сказать функции Replace, что сохранять атрибуты не нужно, в этом случае вы можете установить четвёртый параметр функции IgnoreMetadataErrors в true. Также для заменяемого файла метод Replace создаёт резервную копию.
Вот примеры использования функции Replace:
Создание и удаление директории
Начнём наше знакомство со структурой TDirectory, пожалуй, с методов для создания и удаления директории. Для этого есть соответствующие методы CreateDirectory и Delete. Функция CreateDirectory принимает во входном параметре полный путь к директории и создаёт все недостающие в указанном пути папки. Например, если вы хотите создать директорию «Test3», путь к которой должен быть «C:\Test1\Test2\Test3», а у вас на компьютере есть только директория «C:\Test1», которой нет директории «Test2», то функция CreateDirectory создаст сначала директорию «Test2» в директории «Test1», а затем создаст директорию «Test3» в директории «Test2». Т.е. после вызова этой функции у вас будут все три директории, указанные в пути.
Функция Delete удаляет только последнюю директорию, указанную в пути. Например, если у вас на диске «C:» есть директория «Test1», в ней директория «Test2», и в ней директория «Test3», то чтобы удалить директорию «Test3» в функцию Delete нужно передать полный путь к этой директории, в нашем примере это будет «C:\Test1\Test2\Test3». Также функция Delete умеет рекурсивно удалять вложенные директории и файлы, если второй входной параметр установлен в true.
Вот примеры использования функций CreateDirectory и Delete:
Читайте также: