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

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

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


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

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

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

    [+] [-]
AZJIO,
76857Может если размер равен 0.000 то задать "---"?
Вполне логично.
76857И, кстати, зачем нам RAW, мы же не будем проверять ошибки неформатированного раздела?
Под категорию RAW попадает слегка подпорченный отформатированный раздел, который можно вылечить данной утилитой.
76857Сортировку добавить в утилиту окончательно?
Я не смотрел, как она у тебя сделана, по чему идет сортировка?
Imxo, мне больше нравится сортировка по номеру диска и разделу, по буквам не вижу особого смысла.

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

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

    [+] [-]
Я не смотрел, как она у тебя сделана, по чему идет сортировка?
Она идёт по любому параметру в обе стороны, кликнув заголовок колонки, а повторный клик меняет порядок сортировки. В архиве есть папка "с сортировкой", ссылку я давал
Можно в ini попробовать добавить номер колонки, по которому сортировать

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

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

    [+] [-]
AZJIO,
76869Можно в ini попробовать добавить номер колонки, по которому сортировать
Резонно, хотя, imxo, ini файл для данной утилиты особо то и не нужен.

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

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

    [+] [-]
nikzzzz, я уже сделал сортировку с ini-файлом, а при его отсутствии сортировка по номеру диска. При чём с сохранением кликнутой сортировки. Пока оптимизирую имена переменных и удаляю дубликаты чтобы ini-параметры были сами ключами в функции сортировки lastcol=>indexSort и updown=>SortOrder, вместо 512 (ширина пункта в памяти) нам хватит 256 (заголовок диска), SizeOf дабы не вычислять делаю в константу. Решаю можно ли SizeOf в константу, это же определяет ширину символа при компиляции, то вроде можно. А также хотел некоторые функции вынести в инклуд, чтобы легче было разбираться. Но с сортировкой уже могу выложить.
Обновил, добавлена сортировка и RAW
Обнаружил проблему при тесте, при извлечении флешки и подключении сортировка приводит к падению программы, возможно, что пункту не назначается ассоциативный параметр.

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

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

    [+] [-]
AZJIO,
76926 Решаю можно ли SizeOf в константу
А зачем это делать?
Константа используется компилятором только для оптимизации кода, если этого не требуется, можно использовать простую переменную или макрос.
Константа не может содержать выражение, которое компилятор не может вычислить на этапе компиляции, например такой код будет выполнен корректно
#x=5
#t=1+#x
Debug #t
А вот такой код
x=5
#t=1+x
Debug #t
приведет к ошибке, т.к. компилятору не известно значение x, оно присваивается в результате выполнения программы, однако, вполне допустим такой код
Structure MeStructure
Byte.b[50]
EndStructure
#t=SizeOf(MeStructure)
Debug #t
Структура определена и компилятор без труда вычислит ее размер.
Естественно, структура должна быть описана перед выполнением присвоения ее размера константе.

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

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

    [+] [-]
nikzzzz
посмотрел структуру Character, там c.c, посмотрел тип .c там 2 байта (в unicode режиме). Ну значит будет работать. Я перезалил, исправив падение после добавление диска и последующей сортировки. Как и говорил не хватало ассоциативного параметра.
Остался непонятный абсурд. Когда я в "Ext2 Volume Manager" добавляю диск Linux у меня появляется 4 диска с одинаковыми значениями (буква, номер). Перезапуск решает проблему, но это странно.

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

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

    [+] [-]
AZJIO,
76928Остался непонятный абсурд. Когда я в "Ext2 Volume Manager" добавляю диск Linux у меня появляется 4 диска с одинаковыми значениями (буква, номер). Перезапуск решает проблему, но это странно.
Да, посмотрел, "Ext2 Volume Manager" генерирует 4 события #DBT_DEVICEARRIVAL при присвоении им буквы диска, по всей видимости это связано с его особенностями, они честно отрабатываются отрабатываются Add_item_LV(Drive) и получаются "лишние" диски.
Решение простое
.......
            Select wParam
              Case #DBT_DEVICEARRIVAL
                SetWindowTitle(0 , "ChkDskGui (подключен " + Drive + ":)")
                Del_item_LV(Drive)
                Add_item_LV(Drive)
              Case #DBT_DEVICEREMOVECOMPLETE
                SetWindowTitle(0 , "ChkDskGui (отключен " + Drive + ":)")
                Del_item_LV(Drive)
            EndSelect
.......
К стати, при подключении нового диска сортировки не происходит.
Добавлено через 26 минут 19 секунд:
И еще, для красивости.
Надпись в Title "подключен " + Drive + ":" желательно , было бы убирать секунд через 10, она перестает быть информативной, ну это так, нужно же к чему-нибудь придраться, чтобы жизнь медом не казалась. ag

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

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

    [+] [-]
nikzzzz
Перезалил. Сделал правильное подключение/отключение диска с несколькими разделами, но если у кого есть такой диск, потестируйте.
Решение простое
надо делать для чуть изменённого алгоритма. Я уже пытался (в коде есть закомментированные строки)
Select wParam
    Case #DBT_DEVICEARRIVAL
;       tmp = drives_avail
;       drives_avail | Mask
;       If tmp <> drives_avail
        Add_item_LV_Mask(Mask)
;       EndIf
    Case #DBT_DEVICEREMOVECOMPLETE
;       drives_avail ! Mask
      Del_item_LV(Mask)
  EndSelect
Но при нескольких сменах буквы в "Ext2 Volume Manager" для имитации переподключения иногда теряется диск, при этом копии не добавляются. Я сделал маску подключенных дисков drives_avail глобальной, при добавлении мы объединяем флаги "drives_avail | Mask" если предыдущая копия и новая различаются, то произошло фактическое добавление и отправляем маску подключенных дисков в функцию добавления. При отключении просто вычитаем маску отключаемых из общего списка. И если у меня иногда не добавляется диск, то может "генерирует 4 события #DBT_DEVICEARRIVAL" сопровождается иногда и событием #DBT_DEVICEREMOVECOMPLETE. Потому что у меня то 3 диска добавляются, то 5, причём сначала 3 и через секунду ещё 2, а потом может он для лишнего генериует отключение и у меня единственный диск пропадает.
было бы убирать секунд через 10
думаю это не критично, ситуация добавления редкая, скорее всего запустил прогу, потом забыл на 10 минут, потом добавил диск для других целей, далее увидел в заголовке добавление, вот этот вариант более вероятный. Причём информативный, виден последний добавленный диск.
при подключении нового диска сортировки не происходит.
не сложно выдать команду на сортировку после добавления, тем более флаги глобальные, но в том что диск появляется в конце списка тоже есть смысл, обычно добавят то что надо исправлять, вот как раз не надо искать его в списке, так как будет последним. В текущем исходнике принудительная сортировка в строке 232-235, можно оформить функцией и выслать после функции выравнивания align_col_LV.
Обновил, добавил функцию сортировки при добавлении. Отключить легче, когда ненужна. В англ-версию добавил внешний Lang.ini файл. Исправления: перенёс выравнивание, убрал UpdateWindow_() - пустышка.

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

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

    [+] [-]
AZJIO
А не проще ли при появлении события #DBT_DEVICEARRIVAL заново пересканировать все диски и создать новую таблицу с нуля, не используя разностные методы?
Не большая потеря в скорости в данном случае не принципиальна, зато будет полная гарантия, что диски обновлены правильно.
К стати, при таком подходе можно обрабатывать #DBT_DEVICEARRIVAL и #DBT_DEVICEREMOVECOMPLETE одинаково.

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

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

    [+] [-]
Обновил.
1. Добавил удаление дубликатов дисков при монтировании Linux с помощью "Ext2 Volume Manager"
2. Если есть пункт ChkDskGui в меню дисков, то вместо добавления пункт удаления.
Если смысл компилировать с запуском проги от админа? В LiveCD и так все права, в обычной для флешек не требуется, для добавления в реестр для теста системного диска требуется. Теоретически 50 на 50.

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

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

    [+] [-]
Обновил.
На WindowsXP вылетала ошибка, хоть и не мешала дальнейшей работе, исправил. Запрос размера только при получении всех данных, а RAW только для Vista и выше.
Добавил вариант с требованием админских прав при запуске.

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

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

    [+] [-]
Я частенько с этим сталкиваюсь, при том что другой ChkDskGui (в сборках Xemom есть, автора не знаю),он на скрине,всегда видит диски,даже если файловая система битая и диск в проводнике не отображается она видит такие диски с нулевым размером,после скана и исправления, всё начинает прекрасно работать.
1. На самом деле получить все диски, которые отображаются в проводнике на много легче чем анализировать информацию о дисках и вывести ожидаемые.
2. Изначально автор программы NIKZZZZ, и первые упоминания можешь найти тут
3. Некоторое время спустя 526549 предъявил свой вариант говоря о недостатках, тут и другой автор тут (55 кб). Ну а так как скрипт был уже открытым я предложил модернизацию

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

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

    [+] [-]
AZJIO,
Сделал правильное подключение/отключение диска с несколькими разделами, но если у кого есть такой диск, потестируйте.
Проверял на zalman-e,проблем с отображением не увидел. Сейчас проверил крайнюю версию программы,все диски и флешки видны и даже картридер(отображался так ---), лично меня не напряг большой список разделов.Пока не попался такой комп с сильно "грязным" разделом как я описывал ранее. как попадется ,обязательно отпишусь. А вообще спасибо за удобную программу.

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

    zdoba
  • 138
  • Стаж: 9 лет 3 месяца
  • Сообщений: 357
  • Репутация:22

    [+] [-]
  • Откуда: Россия
AZJIO, Привет. Проверил последнюю версию. Запустил ChkDskGui, подключил внешний диск с тремя видимыми разделами - всё определилось. После физического отключения диска почему-то остался один раздел.

Не напрягает, просто для информации.

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

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

    [+] [-]
Обновил.
Добавил игнорирование дисков. Можно добавить в ini-файл "ignore = EFGH" допустим 4 буквы картридера. Диски AB можно игнорировать параметром StartDisk = 2, то есть отсчёт от диска "C", то есть вместо "ignore = AB" лучше "StartDisk = 2". А картридер конкретно буквы "ignore = EFGH". Или например если LiveCD дублирует диски, то дублированные для данной LiveCD можно убрать из списка.
Кроме того я опять попробовал вместо функции проверки дубликатов дисков использовать маску дисков. Причина я обнаружил возможную проблему при удалении дисков методом "drives_avail ! Mask", логика "исключающего или" при 0 и 1 даёт 1, то есть удаление несуществующего диска наоборот включит флаг существования (можно игнорировать надеясь что Microsoft ни при каких условиях не предложит отключить несуществующий диск), поэтому сделал так "drives_avail ! (Mask & drives_avail)" сначала в маске остаются только существующие, а потом удаление только существующих. Но при тесте я не смог воспроизвести сбой старого и нового варианта, поэтому не уверен, просто перестраховочный манёвр добавил.
Из багов: при сортировки дисков по номеру [1:2] пока сделан лексикографический способ, то есть буквенный, 2>1 поэтому от 0 до 9 работать будет красиво, теперь вариант, который я не предполагал, но всё же 11 дисков и 10-ый уже должен быть между 1 и 2, так как первая цифра 1. Чтобы сортировать по числам нужно усложнять функцию, то есть получить текст [1:2] отрезать крайние скобки, разделить текст по ":" и сравнивать как число, то есть в функцию сравнения добавить условие для колонки 1 (отсчёт от 0). На сколько вероятность, что число дисков больше 10?
Хотел объединить флаги направления, вместо двух сделать один флаг, типа -5, где минус это направление 5 - индекс колонки. Но проблема, у колонки 0 нет минуса, -0 не бывает если рассматривать как число, только если рассматривать как текст, то можно и -0. Ну или сделать отсчёт от 1, тогда отследив направление по "< 0", далее отнять 1 получим индекс (на этапе чтения ini).
Ещё была идея - добавить в меню проверку диска задав букву. Клик на пункте предлагает ввести букву и далее проверяет. Хотя на данный момент я уже не вижу вариант, что диск не добавиться.
zdoba, есть ещё идея на счёт ошибки отключения, но буду пробовать после работы. Я отключаю диски отсчитывая от 0 вверх, а надо сверху вниз, потому что при удалении верхние индексы сдвигаются вниз, то есть диски снизу 4, 5, 6 при удалении 4-го 5 и 6 станет 4 и 5 сдвинувшись, а цикл продолжает удалять 5 (бывший 6-й), потом 6 стал уже 4-тым, а функция удаляет несуществующий 6 индекс. На такой простоте попался ag

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


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

Текущее время: 29-Мар 09:44

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


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