как получить размер диска? GetDiskFreeSpaceEx не работает.

Тема в разделе "WASM.WIN32", создана пользователем Quark, 6 дек 2008.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    я запрашиваю все диски в системе

    GetLogicalDriveStrings

    затем получаю их размеры

    GetDiskFreeSpaceEx

    но если диска нет в дисководе (например, А:\), то вылазит мессага. Что за идиотизм? нельзя было просто выдать код ошибки?

    Хотелось бы услышать альтернытивные методы получения размера диска, в которых нет такого идиотизма.
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    IOCTL_ и DeviceIoControl напрямую к девайсу
     
  3. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Что за гавH0виндовс? Какой идиот придумывал это кривущее АПИ??? Размер харда напрямую получить нельзя.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Quark
    > вылазит мессага. Что за идиотизм? нельзя было просто выдать код ошибки?
    Вызывай так
    Код (Text):
    1. ...
    2. invoke  SetErrorMode, SEM_FAILCRITICALERRORS
    3. push    eax
    4. invoke  GetDiskFreeSpaceEx, ...
    5. mov ebx,eax
    6. invoke  GetLastError
    7. mov edi,eax
    8. call    SetErrorMode
    9. test    ebx,ebx
    10. jz  GetDiskFreeSpaceEx_failed_LastError_in_EDI
    11. ...
     
  5. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Это, конечно, вариант. Но GetDiskFreeSpaceEx виснет секунды на 3. Если в системе картридер на 8 дисков, то он полминуты будет грузиться.
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    как те такая CTL'ка: IOCTL_DISK_GET_PARTITION_INFO ?
    и соответствующая структура:
    Код (Text):
    1. PARTITION_INFORMATION STRUCT        ; sizeof = 20h
    2.     StartingOffset      LARGE_INTEGER   <>
    3.     PartitionLength     LARGE_INTEGER   <>
    4.     HiddenSectors       DWORD       ?
    5.     PartitionNumber     DWORD       ?
    6.     PartitionType       BYTE        ?
    7.     BootIndicator       BOOLEAN     ?
    8.     RecognizedPartition BOOLEAN     ?
    9.     RewritePartition    BOOLEAN     ?
    10.                         DWORD       ?   ; padding
    11. PARTITION_INFORMATION ENDS
    12. PPARTITION_INFORMATION typedef ptr PARTITION_INFORMATION
    обрати внимание на поле PartitionLength :) enjoy ;)

    ЗЫ:
    если всё таки харда а не раздела то IOCTL_DISK_GET_DRIVE_GEOMETRY и применив несложную арифметику получишь размер харда
     
  7. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Извиняюсь. Имею ввиду раздел. Вобщем задача: отобразить папку "Мой компьютер" в лист вью.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Quark
    Чтобы не боксилась мессага юзай NtSetInformationProcess(ProcessDefaultHardErrorMode).
    [Уже q_q скозал, только заметил.]
     
  9. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    если так уж хочется использовать GetDiskFreeSpaceEx можно попробовать запускать её в отдельном потоке, ждать N миллисекунд, прибивать по таймауту, только с сидюками может быть трабла - вдруг понадобится раскрутить диск? если диска нет в сидюке - то проблем не будет. хотя можно просто проверять тип носителя перед стартом потока. громоздко конечно получицца, но как вариант...
     
  11. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Ну да. просто отличный вариант :)))
    Мне всё-равно какую функцию юзать - главное чтобы всё работало.