[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия


Последний раз редактировалось: AZJIO (2023-01-25 16:21), всего редактировалось 43 раз(а)

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
Сегодня второй комп на загрузке слетает в синий экран (2 коротких строки) и перезагружается, причём выключение удерживанием 4 секунды автоматически включается комп снова. Попробовал Linux с флешки - не грузится видимо из-за неопределения диска. Моя старая сборка сначала вообще не видела диск, после зачистки контактов увидела, но нет доуступа. Пробую прогу ChkDskGui - не видит диск, потому что не может на нём видимо открыть дескриптор файла, потому что сбой видимо в самом начале диска. Копирую ком.строку для диска "С:" заменяю на "D:", исправила. Но то что ChkDskGui не видит диск меня смутило и я уже чуть было думал не форматировать ли. Надо как то сделать возможность добавить букву, даже в таких сложных обстоятельствах, иначе это создаёт ложное впечатление и вынуждает совершить ошибку.

[Цитировать]

    goga8686
  • 15240
  • Стаж: 7 лет 2 месяца
  • Сообщений: 855
  • Репутация:71

    [+] [-]
AZJIO, aa
Но то что ChkDskGui не видит диск меня смутило
Я частенько с этим сталкиваюсь, при том что другой ChkDskGui (в сборках Xemom есть, автора не знаю),он на скрине,всегда видит диски,даже если файловая система битая и диск в проводнике не отображается она видит такие диски с нулевым размером,после скана и исправления, всё начинает прекрасно работать.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
goga8686, сделать то это не сложно, просто цель игнора была в запрете показа дисков картридера и всяких виртуальных дисков из папок. То есть определил доступ к файловой системе, значит диск, но это вышло вот такой вот проблемой
даже если файловая система битая и диск в проводнике не отображается
наверно файлы на диске не отображаются, а не сам диск, потому что чекдиску нужна буква


Последний раз редактировалось: AZJIO (2020-04-30 20:36), всего редактировалось 1 раз

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO, aa
Посмотрел твой исходник, там у тебя в список не добавляются диски, если их параметры нечитаемы.
Подправил твой исходник (чисто для примера)

source.pb

Procedure.s ComboListDrive(Drive2$)
  Protected.l Serial, type, i
  Protected.s Lfwrk, FileSystem, VolName, r = Chr(10)
  Protected.q total_bytes
  Protected Result.s=Drive2$+":"
  Lfwrk=Drive2$+":\"
  type =GetDriveType_(Lfwrk)
  FileSystem = Space(256)
  VolName= Space(256)
  Select type
    Case 0
      ProcedureReturn "-"
    Case 2
      ;                 Drive2$+":  Rem    "
      Result + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Rem  "
    Case 3
      ;                 Drive2$+":  Fixed  "
      Result + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Fixed"
    Default
      ProcedureReturn Result + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Unknown"
  EndSelect
  ;     Drive2$ = DriveGetNumber(Left(Drive2$,1) + ":") + "  " + Drive2$
  If GetVolumeInformation_(@Lfwrk, @VolName, 255, @Serial, 0, 0, @FileSystem, 255)
    Result + r + VolName + r + FileSystem
    If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0))
      ;      Drive2$ + "  "+  Str(total_bytes/1048576)+ " Мб"
      Result + r + FormatSizeDisk(total_bytes)
    EndIf
    Else
      Result + r + "??????" + r + "????" + r + FormatSizeDisk(total_bytes)
  EndIf
  ProcedureReturn Result
EndProcedure
Результат:

Диск H: стал виден (это не отформатированная флэшка), в твоем случае она просто была не видна.


Последний раз редактировалось: nikzzzz (2020-04-30 23:24), всего редактировалось 3 раз(а)

[Цитировать]

    goga8686
  • 15240
  • Стаж: 7 лет 2 месяца
  • Сообщений: 855
  • Репутация:71

    [+] [-]
AZJIO,
наверно файлы на диске не отображаются
Верно.Я неправильно выразился.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
76787То есть определил доступ к файловой системе, значит диск
Это неправильно для данной утилиты, не подключенные диски, конечно желательно исключить, а вот доступа к файловой системе может и не быть, причем chkdsk иногда эту проблему решает.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
nikzzzz, как же быть с картридером без диска? Сейчас получится все диски имеющие буквы появятся. И во-вторых не получим ли мы сообщение при обращении за информацией о диске, о том что в картридере нет диска, как это делает Ghost, выкидывает 4 мессаги на каждом запуске которые просто закрываешь каждый раз.
76791 а вот доступа к файловой системе может и не быть, причем chkdsk иногда эту проблему решает.
так у меня этот случай и произошёл и я исправил диск
Хотя мессагу мы не получим, потому что не запрашиваем размер и тип, а просто выпрыг из функции раньше. Да, даже такой способ и есть решение

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
76793Сейчас получится все диски имеющие буквы появятся.
Я эту проблему (исключить не подключенные диски) решал, правда давно, посмотрю наверняка где-то решение валяется, найду, отпишусь.
К сожалению, у меня нет старых картридеров, а современные буквы для пустышек не добавляют, проверить не на чем.
В принципе, можно плюнуть на это, есть, конечно, небольшое неудобство, но при любом раскладе повредить систему не получится.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
Обновил. В архив добавил временную версию, которую мы пытались тестировать на компе Joker-2013. Её отличие в том, что при подключении дисков с несколькими разделами при работающей утилите все диски нормально добавляются и удаляются из списка, а из недостатков наверно то что утилита изменяет размер окна во время добавления дисков из за этого при запуске окно дёргается расширяясь.
Добавил в архив английскую версию, точнее на русской Windows будет русский фейс, на английской - английский.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO
Посмотри, я немного еще поправил твою проседуру ComboListDrive(), по идее должна теперь не видеть пустые картридеры, но не гарантирую, проверить не на чем.
За одно, подправил вывод инфы, смотри картинку.
Добавлено через 16 минут 43 секунды:
Поправил пост.
Добавлено через 53 минуты 42 секунды:
AZJIO
И еще, после проверки раздела, желательно было бы снять с него галку, но это так, надо же к чему-то придраться az am am

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
nikzzzz, я сначала добавил вопросительные знаки
Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Unknown" + r + "?" + r + "?"
а потом убрал, вроде как пустота означает что данные не определены. На счёт "Rem", "Fixed" после завтра буду смотреть, работа.
Галки можно снять сразу после нажатия "Старт", как начатая процедура, но всё же они информативны. У меня была идея сделать проверенные диски блеклыми, тогда можно галки снять, а также изменить цвет тех дисков, в которых проблема файловой системы, то есть картридеры будут другим цветом.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO,
76802У меня была идея сделать проверенные диски блеклыми
Не вижу особого смысла, утилита все-таки предназначена не для полных лузеров, да и им это не нужно, все равно ничего не поймут, а нормальный пользователь и так разберется, разве что, в качестве развлечения.
Добавлено через 4 минуты 3 секунды:
76802вроде как пустота означает что данные не определены
Imxo. пустота не означает ничего, "????" или "----" более информативны.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
Обновил.
Добавил отдельный вариант с сортировкой (+2 кб). То есть нажать на заголовок колонки и данные сортируются по текущей колонке, строки лексикографически, размер по числу. Отдельно пример сортировки.
Двойной клик на диске открывает его в проводнике.
nikzzzz, сделал почти так, запрос размера самостоятельный вызов, а не внутри, в любом случае ведь проверяется ошибка апи-функции. Пустышка "---", кстати её получить можно подключив телефон, когда он не успел определиться и диск ещё недоступен, или Linux-раздел.
nikzzzz, так как я ранее добавлял только FIXED и REMOVABLE а остальные игнорировал, то похоже можно добавить в игнор CDROM, RAMDISK... или даже вернуть выпрыг из функции для типов кроме FIXED и REMOVABLE, потому что повреждение файловой системы всё равно определяет тип диска. Если диск есть, значит и тип есть, ну или по крайней мере оставить для UNKNOWN (неформатированный или сбойный), а игнорировать точные определения типа:
DRIVE_UNKNOWN // неизвестеный
DRIVE_NO_ROOT_DIR // корневой папки нет
DRIVE_REMOVABLE // съёмный, флешка
DRIVE_FIXED // жёсткий диск

DRIVE_REMOTE // удаленный, т.е. сетевой
DRIVE_CDROM // СD ROM
DRIVE_RAMDISK // В оперативной памяти
чтобы исключить диски X:, B:, CDROM
Тест виртуального диска из папки выдал тип FIXED, то есть это не игнорируется

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
AZJIO, aa
76835запрос размера самостоятельный вызов
Тогда уж надо получать размер раздела, даже если он RAW, пример

source.pb

;Чтение размера RAW диска
Structure DISK_GEOMETRY
  Cylinders.q
  MediaType.l
  TracksPerCylinder.l
  SectorsPerTrack.l
  BytesPerSector.l
EndStructure
Structure DISK_GEOMETRY_EX Extends DISK_GEOMETRY
  DiskSize.q
  byte.b[1]
EndStructure
#FILE_ANY_ACCESS = 0
#METHOD_BUFFERED = 0
#IOCTL_DISK_BASE = 7
Macro CTL_CODE(DeviceType, Function, Method, Access)
  ((DeviceType)<<16)|((Access)<<14)|((Function)<<2)|(Method)
EndMacro
#IOCTL_DISK_GET_DRIVE_GEOMETRY_EX = CTL_CODE(#IOCTL_DISK_BASE, $28, #METHOD_BUFFERED, #FILE_ANY_ACCESS)
Procedure.q _GetDriveSize(Drive.s)
   Protected device.l, bytes.l, os.OSVERSIONINFO, disk.DISK_GEOMETRY_EX
   os\dwOSVersionInfoSize = SizeOf(OSVERSIONINFO)
    device = CreateFile_("\\.\" + Drive, #GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_READ|#FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
    If device <> #INVALID_HANDLE_VALUE
      DeviceIoControl_(device, #IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, 0, 0, @disk, SizeOf(disk), @bytes, 0)
      CloseHandle_(device)
    EndIf
  ProcedureReturn disk\Disksize
EndProcedure
Procedure.s ComboListDrive(Drive2$)
  Protected.l Serial, type, i
  Protected.s Lfwrk, FileSystem, VolName, r = Chr(10)
  Protected.q total_bytes
  Lfwrk=Drive2$+":\"
  type =GetDriveType_(Lfwrk)
  FileSystem = Space(256)
  VolName= Space(256)
;   If Lfwrk = "H:\"
;     Debug type
;   EndIf
  Select type
    Case #DRIVE_REMOVABLE
      Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Rem  "
    Case #DRIVE_FIXED
      Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Fixed"
    Case #DRIVE_REMOTE, #DRIVE_CDROM, #DRIVE_RAMDISK
      ProcedureReturn "-"
    Case #DRIVE_NO_ROOT_DIR
      ProcedureReturn Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "No_Root_Dir"
    Case #DRIVE_UNKNOWN
      ProcedureReturn Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "Unknown"
    Default
      ProcedureReturn Drive2$+":" + r + "[" + DriveGetNumber(Drive2$ + ":") + "]" + r + "---"
  EndSelect
  If GetVolumeInformation_(@Lfwrk, @VolName, 255, @Serial, 0, 0, @FileSystem, 255)
    Drive2$ + r + VolName + r + FileSystem
  Else
    Drive2$ + r + "---" + r + "---"
  EndIf
  ;     Drive2$ = DriveGetNumber(Left(Drive2$,1) + ":") + "  " + Drive2$
  If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0))
    ;      Drive2$ + "  "+  Str(total_bytes/1048576)+ " Мб"
    Drive2$ + r + FormatSizeDisk(total_bytes)
  Else
    Drive2$ + r + FormatSizeDisk(_GetDriveSize(Left(Drive2$,1) + ":"))
  EndIf
  ProcedureReturn Drive2$
EndProcedure

Добавлено через 10 минут 51 секунда:
Imxo, в колонке размер неплохо было бы указать, в чем он измеряется - "Gb"

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1264
  • Репутация:127

    [+] [-]
nikzzzz
1. У меня раздел Linux и телефон (неопределившийся) показали 0.000. Это неформатированный раздел показал 3.744? Как бы сделать отдельно неформатированный и неопределившийся? Может если размер равен 0.000 то задать "---"? Ведь никто не будет создавать раздел размером 0.000 и соответственно это неопределившийся.
If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0))
    Drive2$ + r + FormatSizeDisk(total_bytes)
  Else
    total_bytes = GetDriveSize(Left(Drive2$,2))
    If total_bytes
      Drive2$ + r + FormatSizeDisk(total_bytes)
    Else
      Drive2$ + r + "---"
    EndIf
  EndIf
И, кстати, зачем нам RAW, мы же не будем проверять ошибки неформатированного раздела?
Вот, чтобы цвет сделать (в код-архиве пример он же но без предупреждений)
2. Сортировку добавить в утилиту окончательно? А то напрягает 4 исходника править точечно.

Страница 19 из 34


Показать сообщения:    

Текущее время: 29-Мар 10:13

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы