Обновил, версия 0.9.
Новый алгоритм на картах, всвязи с тем что мне стало более ясно как работать с картами.
Пётр написал(а):Я бы сделал так
Structure Files
Size.q
List SubFiles.SubFiles()
EndStructure
Да, мой код стал похож на такую конструкцию. Я только сейчас обратил на это внимание, когда в голове продумал алгоритм положил его на "бумагу".
Я получаю файлы и создаю подсписок в структуре одинаковых файлов с общим размером . Далее я практически также делаю, но уже с хешем. Создавая карту мне надо размер указывать как строку-ключ, поэтому я делаю поле в структуре для размера. А при создании MD5 я уже использую MD5 как ключ, но всё равно мне нужен размер в структуре, для вывода в результаты и получается, что я 2 раза использую одну и туже структуру.
Новое открытие для себя началось с того что если я не могу сортировать карту, то надо как то данные перенести в с список, ага, перебрать все элементы, потом озарила мысль, что эта структура и мне нужен всего лишь список указателей, который я сортирую по размеру и буду обращаться по указателю. Но в карте нет указателей, даже если я использую NextMapElement, то как я потом выделю текущий указатель. Потом я подумал копировать структуру CopyStructure() и это сработало. Потом подумал а зачем мне копировать структуру, нельзя ли обращаться к ней напрямую, то есть я просто приравнял элемент карты к списку, типа ListMD5() = MapMD5(), то есть в цикле перебираю элементы карты, добавляю элемент списка и приравниваю, и это сработало. И пошёл ещё дальше, так как у меня структуры одинаковые, то я получив карту по размеру тупо приравниваю элементы списка из одной карты в другую карту. Так как у них получается общий указатель на одну и туже структуру, я не могу очистить использованную карту размеров, так как она утянет за собой структуры новой карты, но главное не тратится время на копирование тупо игра с указателями не больше.
Ну теперь мне стало легко сделать сортировку списка и добавил сортировку по "уровню удаления", теперь оно работает, проверено. Например кидаем разные папки в верхнее окно (тестовая папка сделать копии папки, чтобы нашлись дубликаты), выбираем у папок уровни -2 или -1 или 0 или 1 или 2 делаем поиск и получаем, что -2 и -1 не отмечаются галочками, а -2 невозможно поставить галочку, а если и поставить как то, то всё равно удаление этого файла не сработает. Если ставить между уровнями 0-2, то файлы в результатах выстроятся таким образом что удалятся будет в первую очередь из папки с уровнем 2, ведь у нас оставляется один дубликат, так вот с уровнем 2 будет нижним в списке, то есть приоритет на удаление. Грубо говоря папку на флешке можно поставить уровень 2 так как логичнее что правильнее оставить копию на жёстком диске, или есть некая сортированная папка разложенная по полочкам фото, и есть куча на флешке где время от времени копировал что-то показать, так конечно упорядоченная папка будет с меньшим приоритетом на удаление, а мусорная-временная с максимальным приоритетом.
Потом ещё сделаю файл-список, смысл которого, например есть файлы которые однажды проверил что их надо удалить, а они с мусором попали на флешку и ещё куда, так подключил CSV-файл ранее сохранённый и всё что в нём есть считавшийся мусором можно проверить есть ли такое же на флешке (по MD5) и уже перебирать фото на флешке не придётся вычищая опять этот же мусор, так как их хеши уже есть в CSV и можно нажимать "удалить".
Ну и ещё в линуксе использовал StatusBarText, типа настоящий, текст в нём также появляется только после завершения функций, а в винде я помню что работало нормально.
Ещё проблема, есть сериал на 200 серий, в нём 158 серий с одинаковым размером до байта, но 420 Мб каждая серия, естественно что вычислять MD5 этих файлов оказалось расточительное занятие для алгоритма. А значит понятно что надо придумывать перед получением MD5 для файлов более 10 МБ можно сравнить первые 2 Мб или по 100 байт но из разных позиций, в центре и в конце, и только потом приступать вычислять MD5. Вот только надо придумывать идентификатор в карту, разве что эти байты считать идентификаторами.
Отредактировано AZJIO (23.06.2022 05:41:04)