Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Список дисков и subst, Как отличить раздел от subst? 
V
    Опции темы
MadCoder
Дата 30.1.2008, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Привет всем!

Пишу функцию, которая возвращает список разделов жестких дисков и столкнулся с проблемой, что она псевдодиски, созданные программой subst, тоже возвращает. Как можно их не включать в список?

Вот мой пример:
Код

// Определяет список жестких дисков
function List_Drives: TStringList;
 const
   DRIVE_UNKNOWN = 0;
   DRIVE_NO_ROOT_DIR = 1;
   DRIVE_REMOVABLE = 2;
   DRIVE_FIXED = 3;
   DRIVE_REMOTE = 4;
   DRIVE_CDROM = 5;
   DRIVE_RAMDISK = 6;
 var
   r: LongWord;
   Drives: array[0..128] of char;
   pDrive: PChar;
 begin
   Result:=TStringList.Create;
   r := GetLogicalDriveStrings(SizeOf(Drives), Drives);
   if r = 0 then Exit;
   if r > SizeOf(Drives) then
     raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY));
   pDrive := Drives;
   while pDrive^ <> #0 do
   begin
     if GetDriveType(pDrive) = DRIVE_FIXED then
       Result.Add(copy(pDrive,1, length(pDrive)-1));
     Inc(pDrive, 4);
   end;
 end;

PM WWW ICQ   Вверх
Qu1nt
Дата 30.1.2008, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 5
Всего: 50



Из DRKB:
Код

unit Unit1;

{©Drkb v.3(2007): www.drkb.ru}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  NameSize    = 4;
  VolumeCount = 26;
  TotalSize   = NameSize * VolumeCount;
  Report      = 'Volume: %s %s';
var
  Buff, Volume: String;
  lpQuery: array [0..MAXCHAR - 1] of Char;
  I, Count: Integer;
begin
  SetLength(Buff, TotalSize);
  Count := GetLogicalDriveStrings(TotalSize, @Buff[1]) div NameSize;
  if Count = 0 then
    Memo1.Lines.Add(SysErrorMessage(GetLastError))
  else
    for i := 0 to Count - 1 do
    begin
      Volume := PChar(@Buff[(I * NameSize) + 1]);
      case GetDriveType(PChar(Volume)) of
        DRIVE_UNKNOWN: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive type cannot be determined.']));
        DRIVE_NO_ROOT_DIR: Memo1.Lines.Add(Format(Report, [Volume,
          'The root path is invalid. For example, no volume is mounted at the path.']));
        DRIVE_REMOVABLE:
          begin
            Volume[3] := #0;
            QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
            Volume[3] := '\';
            if String(lpQuery) = '\Device\Floppy0' then
              Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Floppy disk A:.']))
            else
              if String(lpQuery) = '\Device\Floppy1' then
                Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Floppy disk B:.']))
              else
                Memo1.Lines.Add(Format(Report, [Volume, 'The drive is a Flash Drive.']));
          end;
        DRIVE_FIXED:
          begin
            Volume[3] := #0;
            QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
            Volume[3] := '\';
            if Copy(String(lpQuery), 1, 22)  = '\Device\HarddiskVolume' then
              Memo1.Lines.Add(Format(Report, [Volume,
                'The disk cannot be removed from the drive.']))
            else
              Memo1.Lines.Add(Format(Report, [Volume,
                'The drive is a SUBST disk on path: "' +
                Copy(String(lpQuery), 5, Length(String(lpQuery))) + '"']));
          end;
        DRIVE_REMOTE: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive is a remote (network) drive.']));
        DRIVE_CDROM: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive is a CD-ROM drive.']));
        DRIVE_RAMDISK: Memo1.Lines.Add(Format(Report, [Volume,
          'The drive is a RAM disk.']));
      else
        Memo1.Lines.Add(Format(Report, [Volume, 'Xpen znaet chto :)']));
    end;
  end;
end;

end.

PM MAIL   Вверх
MadCoder
Дата 31.1.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Все работает, спасибо огромное!
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.