Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перечень дисков [WinXP]


TCrash ©   (2008-04-08 20:36:00) 

Требуется вывести в список только съемные диски. Проверка типа диска нашел - GetDriveType, но не хочется ведь делать

for i:=byte('A') to byte('Z') do ........

как можно получить список дисков компьютера, возможно в какой-то структуре?


Игорь Шевченко   (2008-04-09 22:51:00) [1]

Диск без буквы делается с помощью создания Reparse Point

Но система давно уже внутре с буквами не работает, а работает с томами.
Можно (это для интересующихся) используя WinObj, посмотреть, во что буковки C,D и проч. преобразуются.

Кстати, CreateFileW можно вызывать с именем тома вместо буквы, если хочется получить Handle тома.


guav   (2008-04-09 18:15:00) [2]

По теме - FindFirstVolume/FindNextVolume/FindVolumeClose или IOCTL_MOUNTMGR_QUERY_POINTS


guav   (2008-04-09 18:10:00) [3]

Хардлинк делается так:
fsutil hardlink create <new filename> <existing filename>
хардлинки не имеют отношения к теме т.к. они в пределах тома.

Софтлинки и точки подключения томов это reparse points.

Чтобы у диска не было буквы а была точка подключения папка, можно зайти в Disk Management (diskmgmt.msc) и там Change Drive Letter And Paths...


Riply   (2008-04-09 16:54:00) [4]

>  [14] Riply ©   (09.04.08 16:51)

P.S.
Nt - функции, тоже могут обходиться без букв, причем с большим удовольствием :)


Riply   (2008-04-09 16:51:00) [5]

> [10] Anatoly Podgoretsky ©   (09.04.08 15:40)
> Буквы из этой же оперы, лучше пересмотреть алгоритм и забыть про них,
> поскольку это иллюзия. В системе тома идентифицируются с помощью GUID.

На вкус и цвет..., и кажды сам выбирает что использовать.
Но, из всего многообразия, лично я,
после долгих мучений и обсуждений (была здесь ветка. guav создавал),
остановилась на следующих инструментах для навигации по дискам и работы с ними:
Это IOCTL_MOUNTMGR_QUERY_POINTS.
В структуре _MOUNTMGR_MOUNT_POINT есть полезные поля.

А если сюда еще добавить и SetupApi, то больше вообщем-то и ничего не нужно :)
Разве что можно добавить IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.

В результате буквы дисков остаются нужны, только для вывода пользователю на экран. :)

P.S.
Rouse_ выладывал пример работы с SetupApi. DeviceList, вроде назывался.
Из него можно "выдернуть" нужное.
В MSDN есть перечисление GUID-ов для необходимых классов устройств.


Anatoly Podgoretsky   (2008-04-09 15:55:00) [6]

Я там же читал про Hard Link - can link directories located on different local volumes
Я же говорю, что у них много противоречий в ней по данному поводу. А им бы это надо усиленно пропагандировать как среди программистов, так и предоставить нормальные ГУИ инструмент для этого. Консольный вроде есть, но надо потратить время на его поиск и освоение, да и не всем он под силу.
Я как то выходил на него, темный лес, как и в MSDN


clickmaker   (2008-04-09 15:47:00) [7]


> Надо бы Рипли затянуть в эту ветку

она уже подтянулась. Как пчела на мед ))

На самом деле
A junction (also called a soft link) differs from a hard link in that the storage objects it references are separate directories, and a junction can link directories located on different local volumes on the same computer

(с) MSDN


Anatoly Podgoretsky   (2008-04-09 15:46:00) [8]

> Riply  (09.04.2008 15:30:09)  [9]

Ага ты уже здесь.
Я не знаю, я пока по старинке работаю, а это надо изучать АПИ.
Но на уровне пользователя в диспетчере дисков, как минимум можно сказать, что бы буква не назначалась. Но там вроде нельзя указать точку монтирования, поскольку диск может быть смонтирован в любое место файловой системы.
А вот жесткие ссылки вроде можно сделать только с консоли, одной из утилит, мне правда они особенно не нужны, но стоит подумать об изучении.


Anatoly Podgoretsky   (2008-04-09 15:40:00) [9]

> clickmaker  (09.04.2008 15:28:08)  [8]

А черт его знает, они же умудрились в документации так накрутить, что читаешь и чуствуешь себя дураком, потом переходишь в другой раздел и снова себя тем же чувствует, только по другому.
Словарь говорит, что это стык или железнодорожный узел.

Но при разработке надо учитывать, что буквы может не быть и могут быть хитрые ссылки, они у них уже давно есть и используют по разному, например от простого копирования дистрибутива на другой СД, когда на Диске 700 мб может получаться 4 гб.

Я сейчас осваиваю Висту и столкнулся, что многие утилиты работы с оглавлениями и дисками ведут себя странно, не учитывают этого, странности могут быть самие разные. Программисты пока еще не освоили всех этих тонкостей и пишут в стиле Win9x
Буквы из этой же оперы, лучше пересмотреть алгоритм и забыть про них, поскольку это иллюзия. В системе тома идентифицируются с помощью GUID.

Надо бы Рипли затянуть в эту ветку :-)


Riply   (2008-04-09 15:30:00) [10]

>  [7] Anatoly Podgoretsky ©   (09.04.08 15:26)

> Начиная по крайней мере с ХР диск не обязан иметь букву, а на Висте это получило дальнейшее развитие.

А как это можно симитировать ?


clickmaker   (2008-04-09 15:28:00) [11]


> [7] Anatoly Podgoretsky ©   (09.04.08 15:26)

а Soft link <> Junction Point ?


Anatoly Podgoretsky   (2008-04-09 15:26:00) [12]

> trubin  (08.04.2008 21:58:04)  [4]

Начиная по крайней мере с ХР диск не обязан иметь букву, а на Висте это получило дальнейшее развитие. Кроме того сильно стали использовать Soft/Hard Links и Junction Point
И еще много наворотов, надо уходить от букв.


Тыщ   (2008-04-08 22:09:00) [13]

trubin ©   (08.04.08 22:02) [5]

А я говорю, GetLogicalDrives круче :)

uses Windows;
{$APPTYPE CONSOLE}
var
 Drives:cardinal;
 I:integer;
begin
 Drives:=GetLogicalDrives();
 for I:=0 to 26 do
 begin
   if Drives shr I and 1<>0 then
     Writeln('Drive '+chr(I+ord('a'))+' available');
 end;
end.


trubin   (2008-04-08 22:02:00) [14]

Кроме того зачем лишний цикл. Диски из строки возвращаемой GetLogicalDriveStrings всеравно в цикле получаешь. Получил диск - проверил, всего и делов ... .


trubin   (2008-04-08 21:58:00) [15]


> Парсить строку с буквами, чтоб все равно перечислять в цикле?
> !
> Тогда уж лучше GetLogicalDrives.


Ему все равно надо диски в список выводить, вот буковки и потребуются.

Впрочем из GetLogicalDrives буковки получить тоже не проблема.


Тыщ   (2008-04-08 21:37:00) [16]

trubin ©   (08.04.08 21:30) [2]

>GetLogicalDriveStrings

Парсить строку с буквами, чтоб все равно перечислять в цикле?!
Тогда уж лучше GetLogicalDrives.


trubin   (2008-04-08 21:30:00) [17]


> как можно получить список дисков компьютера, возможно в
> какой-то структуре?


GetLogicalDriveStrings


Тыщ   (2008-04-08 20:39:00) [18]

Во всех программах видел только GetDriveType.
26 букв перебрать - это не так уж и много.


Наверх

Титульная страница Поиск, карта сайта Написать письмо