-
Требуется вывести в список только съемные диски. Проверка типа диска нашел - GetDriveType, но не хочется ведь делать
for i:=byte('A') to byte('Z') do ........
как можно получить список дисков компьютера, возможно в какой-то структуре?
-
Во всех программах видел только GetDriveType. 26 букв перебрать - это не так уж и много.
-
> как можно получить список дисков компьютера, возможно в > какой-то структуре?
GetLogicalDriveStrings
-
trubin © (08.04.08 21:30) [2]
>GetLogicalDriveStrings
Парсить строку с буквами, чтоб все равно перечислять в цикле?! Тогда уж лучше GetLogicalDrives.
-
> Парсить строку с буквами, чтоб все равно перечислять в цикле? > ! > Тогда уж лучше GetLogicalDrives.
Ему все равно надо диски в список выводить, вот буковки и потребуются.
Впрочем из GetLogicalDrives буковки получить тоже не проблема.
-
Кроме того зачем лишний цикл. Диски из строки возвращаемой GetLogicalDriveStrings всеравно в цикле получаешь. Получил диск - проверил, всего и делов ... .
-
trubin © (08.04.08 22:02) [5]А я говорю, GetLogicalDrives круче :) uses Windows;
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 (08.04.2008 21:58:04) [4]
Начиная по крайней мере с ХР диск не обязан иметь букву, а на Висте это получило дальнейшее развитие. Кроме того сильно стали использовать Soft/Hard Links и Junction Point И еще много наворотов, надо уходить от букв.
-
> [7] Anatoly Podgoretsky © (09.04.08 15:26)
а Soft link <> Junction Point ?
-
> [7] Anatoly Podgoretsky © (09.04.08 15:26)
> Начиная по крайней мере с ХР диск не обязан иметь букву, а на Висте это получило дальнейшее развитие.
А как это можно симитировать ?
-
> clickmaker (09.04.2008 15:28:08) [8]
А черт его знает, они же умудрились в документации так накрутить, что читаешь и чуствуешь себя дураком, потом переходишь в другой раздел и снова себя тем же чувствует, только по другому. Словарь говорит, что это стык или железнодорожный узел.
Но при разработке надо учитывать, что буквы может не быть и могут быть хитрые ссылки, они у них уже давно есть и используют по разному, например от простого копирования дистрибутива на другой СД, когда на Диске 700 мб может получаться 4 гб.
Я сейчас осваиваю Висту и столкнулся, что многие утилиты работы с оглавлениями и дисками ведут себя странно, не учитывают этого, странности могут быть самие разные. Программисты пока еще не освоили всех этих тонкостей и пишут в стиле Win9x Буквы из этой же оперы, лучше пересмотреть алгоритм и забыть про них, поскольку это иллюзия. В системе тома идентифицируются с помощью GUID.
Надо бы Рипли затянуть в эту ветку :-)
-
> Riply (09.04.2008 15:30:09) [9]
Ага ты уже здесь. Я не знаю, я пока по старинке работаю, а это надо изучать АПИ. Но на уровне пользователя в диспетчере дисков, как минимум можно сказать, что бы буква не назначалась. Но там вроде нельзя указать точку монтирования, поскольку диск может быть смонтирован в любое место файловой системы. А вот жесткие ссылки вроде можно сделать только с консоли, одной из утилит, мне правда они особенно не нужны, но стоит подумать об изучении.
-
> Надо бы Рипли затянуть в эту ветку
она уже подтянулась. Как пчела на мед ))
На самом деле 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
-
Я там же читал про Hard Link - can link directories located on different local volumes Я же говорю, что у них много противоречий в ней по данному поводу. А им бы это надо усиленно пропагандировать как среди программистов, так и предоставить нормальные ГУИ инструмент для этого. Консольный вроде есть, но надо потратить время на его поиск и освоение, да и не всем он под силу. Я как то выходил на него, темный лес, как и в MSDN
-
> [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-ов для необходимых классов устройств.
-
> [14] Riply © (09.04.08 16:51)
P.S. Nt - функции, тоже могут обходиться без букв, причем с большим удовольствием :)
-
Хардлинк делается так: fsutil hardlink create <new filename> <existing filename> хардлинки не имеют отношения к теме т.к. они в пределах тома.
Софтлинки и точки подключения томов это reparse points.
Чтобы у диска не было буквы а была точка подключения папка, можно зайти в Disk Management (diskmgmt.msc) и там Change Drive Letter And Paths...
-
По теме - FindFirstVolume/FindNextVolume/FindVolumeClose или IOCTL_MOUNTMGR_QUERY_POINTS
-
Диск без буквы делается с помощью создания Reparse Point
Но система давно уже внутре с буквами не работает, а работает с томами. Можно (это для интересующихся) используя WinObj, посмотреть, во что буковки C,D и проч. преобразуются.
Кстати, CreateFileW можно вызывать с именем тома вместо буквы, если хочется получить Handle тома.
|