Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2013, 12:04   #1
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию Получить список локальных дисков

Как узнать список локальных дисков (тоесть те, на которых файлы папки и тд)? их у меня 2. С помошью следущего кода я получаю все диски, которые видны в "Мой компьютер" , в тч конечно и локальные (D,C).
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: integer;
  buf: array [0..499] of char;
  DrvStr: array [0..9] of char;
  LogDrives: set of 0..25;
begin
  integer(LogDrives) := GetLogicalDrives;
  for i := 0 to 25 do
    if (i in LogDrives) then
      ListBox1.Items.Add(chr(i + 65));

       GetLogicalDriveStrings(1000, buf);
  i := 0;
  repeat
    FillChar(DrvStr, SizeOf(DrvStr), #0);
    j := 0;
    repeat
      DrvStr[j] := buf[i];
      inc(j);
      inc(i);
    until
      (buf[i] = #0) or (j > 9);
    inc(i);
    ListBox2.Items.Add(DrvStr);
  until
    ((buf[i-1] = #0) and (buf[i] = #0)) or (i > 499);
end;
end.
как бы получить только локальные?
igrok111 вне форума Ответить с цитированием
Старый 08.06.2013, 12:28   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

получай те, что с флагом DT_DIXED
Человек_Борща вне форума Ответить с цитированием
Старый 08.06.2013, 12:31   #3
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

и как найти флаг диска? моей функцией показует только буквы дисков
igrok111 вне форума Ответить с цитированием
Старый 08.06.2013, 13:56   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Функция GetDriveType
Человек_Борща вне форума Ответить с цитированием
Старый 08.06.2013, 14:27   #5
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Функция GetDriveType
спс. вот что получаеться. я проверяю все буквы дисков подряд этой функцией - и да локальные возвращают одно значение, остальные другое, тоесть отличать можно. Но все ли правильно? у меня возвращает или 3(локальные) или 5(двд-ром и тд)
вот таким способом:
Код:
edit1.Text:=inttostr(getdrivetype('D:\'));
//получаеться 3
igrok111 вне форума Ответить с цитированием
Старый 08.06.2013, 14:55   #6
Lardes
Форумчанин
 
Аватар для Lardes
 
Регистрация: 19.08.2011
Сообщений: 329
По умолчанию

Кидаю кусок кода из проекта (самостоятельно подкорректируешь под себя)

Код:
function GetDriveVolume(Drive: string): string;
var
  _VolumeName, _FileSystemName: array [0..MAX_PATH - 1] of Char;
  _VolumeSerialNo, _MaxComponentLength, _FileSystemFlags: LongWord;
begin
  Result := '';
  if GetVolumeInformation(PChar(Drive + ':\'), _VolumeName, MAX_PATH,
    @_VolumeSerialNo, _MaxComponentLength ,_FileSystemFlags,
    _FileSystemName, MAX_PATH)
  then
    Result := _VolumeName;
end;

procedure GetDriveList(StringList: TStringList);
var
  DriveList: TStringList;
  Drive: Char;
  I: Integer;
begin
  FILE_LIST.Clear;
  DriveList := TStringList.Create;
  for Drive := 'a' to 'z' do
  begin
    case GetDriveType(PChar(Drive + ':\')) of
      DRIVE_REMOVABLE:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_REMOVABLE)');
        end;
      DRIVE_FIXED:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_FIXED)');
        end;
      DRIVE_CDROM:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_CDROM)');
        end;
      DRIVE_RAMDISK:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_RAMDISK)');
        end;
      DRIVE_REMOTE:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_REMOTE)');
        end;
    end;
  end;
  FILE_LIST.Sort;
  DriveList.Sort;
  for I := 0 to DriveList.Count - 1 do
    SENDMESSAGE_LIST.Add(Format('%d - %s', [I + 1, DriveList.Strings[I]]));
  DriveList.Free;
end;
Lardes вне форума Ответить с цитированием
Старый 08.06.2013, 15:23   #7
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Lardes Посмотреть сообщение
Кидаю кусок кода из проекта (самостоятельно подкорректируешь под себя)

Код:
function GetDriveVolume(Drive: string): string;
var
  _VolumeName, _FileSystemName: array [0..MAX_PATH - 1] of Char;
  _VolumeSerialNo, _MaxComponentLength, _FileSystemFlags: LongWord;
begin
  Result := '';
  if GetVolumeInformation(PChar(Drive + ':\'), _VolumeName, MAX_PATH,
    @_VolumeSerialNo, _MaxComponentLength ,_FileSystemFlags,
    _FileSystemName, MAX_PATH)
  then
    Result := _VolumeName;
end;

procedure GetDriveList(StringList: TStringList);
var
  DriveList: TStringList;
  Drive: Char;
  I: Integer;
begin
  FILE_LIST.Clear;
  DriveList := TStringList.Create;
  for Drive := 'a' to 'z' do
  begin
    case GetDriveType(PChar(Drive + ':\')) of
      DRIVE_REMOVABLE:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_REMOVABLE)');
        end;
      DRIVE_FIXED:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_FIXED)');
        end;
      DRIVE_CDROM:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_CDROM)');
        end;
      DRIVE_RAMDISK:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_RAMDISK)');
        end;
      DRIVE_REMOTE:
        begin
          FILE_LIST.Add(UpCase(Drive) + ':\');
          if GetDriveVolume(Drive) <> '' then
            DriveList.Add(UpCase(Drive) + ': (' + GetDriveVolume(Drive) + ')')
          else
            DriveList.Add(UpCase(Drive) + ': (' + 'DRIVE_REMOTE)');
        end;
    end;
  end;
  FILE_LIST.Sort;
  DriveList.Sort;
  for I := 0 to DriveList.Count - 1 do
    SENDMESSAGE_LIST.Add(Format('%d - %s', [I + 1, DriveList.Strings[I]]));
  DriveList.Free;
end;
я пока новичек практически и с этим сложно мне. Вот ошибка появляеться Undeclared identifier: 'FILE_LIST'
это нужно обьявить где-то?
igrok111 вне форума Ответить с цитированием
Старый 08.06.2013, 15:41   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Вам дали кусок кода из рабочего проекта, уж что что, но просто копипастой этот код работать не будет. То что вам нужно, есть в case .. of.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список подключенных сетевых дисков calypso Работа с сетью в Delphi 1 02.12.2012 19:59
Не видны 2 из 3 локальных дисков. Blombastik Компьютерное железо 3 09.08.2012 23:34
Список дисков k3rn3l Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 15.11.2011 07:40
win7 x64 не отабражает локальных дисков helpm Windows 4 21.11.2010 13:19
Вырубился комп, после его включения один из локальных дисков стал глючить - часть файлов не открывается AnthonyTom Компьютерное железо 12 21.06.2009 18:47