Исключение виртуальных дисков в утилитах мониторинга: как обойти ошибки GetDriveType для Google Drive
Вопрос, возникший у разработчика, заключается в том, что его утилита, написанная на языке Delphi, для мониторинга свободного места на дисках, неправильно идентифицирует Google Drive как жесткие диски (DRIVE_FIXED). Это приводит к тому, что виртуальные диски включаются в список отслеживаемых, что нежелательно для данной утилиты. В качестве временного решения было предложено проверять название диска на наличие подстроки "google", однако это не является оптимальным решением.
Описание проблемы
Используя функцию GetDriveType, разработчик обнаружил, что Google Drive определяются как жесткие диски. Это приводит к тому, что утилита возвращает список всех дисков, включая виртуальные, в то время как требуется отображение только физических дисков.
Пример кода
procedure TFormSpace.CreaLabels;
var
Type, i, n: Word;
LblDummy: TLabel;
Candidate: string;
begin
Max:=0;
i:=1;
repeat
Candidate:=chr(ord('C')+i-1) + ':\';
Type:=GetDriveType(pchar(Candidate));
if (Type=DRIVE_FIXED) then begin
//Do something
end;
i:=i+1;
until (i=MaxItems);
end;
Ожидаемый результат
Например, при настройке утилиты для мониторинга дисков с такими путями:
- C:\ -> 1TB SSD
- D:\ -> 2TB SSD
- F:\ -> Маппированный сетевой диск
- G:\ -> Google Drive, копия на D:\Drive
Утилита должна отображать только физические диски: C:\ и D:\, исключая виртуальные.
Альтернативный ответ
Разработчику было предложено использовать функцию GetVolumeInformationW, которая может предоставить дополнительные сведения о диске.
Подтвержденный ответ
Оказалось, что для исключения виртуальных дисков можно использовать флаг FILE_SUPPORTS_REMOTE_STORAGE (значение 0x00000100). Этот флаг указывает на поддержку удаленного хранения, и его наличие позволяет идентифицировать виртуальные диски, такие как Google Drive, и исключить их из списка мониторинга.
Рекомендуемое решение
Для корректной работы утилиты необходимо модифицировать функцию проверки типов дисков, добавив проверку на наличие флага FILE_SUPPORTS_REMOTE_STORAGE. Это позволит избежать включения виртуальных дисков в список отслеживаемых и сделать отображение более точным.
Пример кода с учетом рекомендации
uses
ShlObj_Pas; // Для использования GetVolumeInformation
procedure TFormSpace.CreaLabels;
var
Type, i, flags: DWORD;
Candidate: string;
begin
Max:=0;
i:=1;
repeat
Candidate:=chr(ord('C')+i-1) + ':\';
Type:=GetDriveType(pchar(Candidate));
if (Type=DRIVE_FIXED) then begin
GetVolumeInformation(Candidate, nil, 0, nil, nil, flags);
if (flags and FILE_SUPPORTS_REMOTE_STORAGE) = 0 then begin
// Это физический диск, выполняем необходимые действия
end;
end;
i:=i+1;
until (i=MaxItems);
end;
Следуя данному подходу, утилита будет корректно отображать только физические диски, исключая из списка виртуальные диски, такие как Google Drive.
Разработчик столкнулся с проблемой, когда его утилита для мониторинга дисков неправильно идентифицировала Google Drive как жесткие диски, что необходимо исправить для корректной работы программы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.