Find My Duplicates

Обзоры Find My Duplicates 1.2

Переводчик Google

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
7,871
Решения
27
Реакции
7,013
Dragokas добавил(а) новый ресурс:

Find My Duplicates - Утилита для поиска и удаления дубликатов файлов любого типа

Сегодня на обед кое-что простое, но полезное.
Таких утилит наверное множество, но хотелось сделать своё, что работает по понятному алгоритму, быстро, с современными технологиями и без сюрпризов внутри.

Назначение:
Поиск и удаление идентичных файлов из указанных папок (нужно перетащить их на окно программы (Drag & Drop)).

Посмотреть вложение 115307

Технологии

  • Многопоточный поиск файлов с оптимизацией через SQLite...

Узнать больше об этом ресурсе...
 
Последнее редактирование:
Последнее редактирование:
Почему-то drag-n-drop не работает, при наведении показывает ❌

UPD пришлось добавлять кнопку browse через исходники
 
Последнее редактирование:
Dragokas обновил(а) ресурс Find My Duplicates - новой записью:

1.2

  • Перетаскивание файлов теперь работает даже при запуске с повышенными правами
  • Новая кнопка «Добавить папку»
  • Новая кнопка «Очистить список»
  • Контекстное меню на первой форме
  • Подтверждение перед удалением дубликатов
  • Контекстное меню «Открыть папку» на второй форме
  • Улучшен пользовательский интерфейс, поддержка изменения размера и полноэкранного режима

Узнать больше об этом обновлении...
 
Последнее редактирование:
@BlendLog а запускал с повышенными правами? Если да, то это ожидаемое поведение, из-за изоляции UIPI. Она запрещает drag & drop из-под процесса с более низким уровнем целостности. Для его обхода часто применяют ChangeWindowMessageFilterEx + WM_DROPFILES / WM_COPYDATA / WM_COPYGLOBALDATA. Но это не сработает с C# формами, т.к. они построены на базе COM. Даже если попытаться разрешить фильтр на хендлах окон (this.Handle), вернет результат true, но drag & drop работать все равно не будет.

Чтобы обойти эту проблему, в обновлении я создал настоящее Win32 окно без оберток, и сделал его в качестве оверлея со стилем WS_POPUP. Оно не является настоящим дочерним окном (параметр WS_CHILD не используется). При попытке сделать его дочерним, прорисовка этого окна вступает в конфликт с прорисовкой нижнего слоя (окна WinForms), в итоге получается каша, а DnD перестает работать. В итоге, принял решение двигать окно событием параллельно с движением формы WinForms. Думаю, вышло неплого, разве что только при анимации входа в полноэкранный режим получается слегка дергано. Кстати, несмотря на то что окно не дочернее, хендл родительского окна все равно необходимо передавать при создании окна, иначе окно перестанет быть поверх WinForms при смене фокуса. Также, чтобы это сработало у WinForms должно быть отключено свойство AllowDrop. Оба они (включенный дроп у WinForms, и у Win32 окна конфликтуют между собой, и DnD перестает работать :) В итоге, AllowDrop отключается, если апка запущена от админа, и включена если без. Т.е. без админа - DnD работает по всей форме, а от админа - только на зеленую штучку:

1771180052649.webp
 
Последнее редактирование:
Скачал новую версию. Что-то пошло не так
Код:
Application: DuplicateFilesRemover.exe
CoreCLR Version: 10.0.326.7603
.NET Version: 10.0.3
Description: The process was terminated due to an unhandled exception.
Exception Info: System.NullReferenceException: Object reference not set to an instance of an object.
   at DuplicatesFinder.FormAccept.MoveOverlay()
   at DuplicatesFinder.FormAccept.FormAccept_Resize(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnResize(EventArgs e)
   at System.Windows.Forms.Control.OnSizeChanged(EventArgs e)
   at System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 clientWidth, Int32 clientHeight)
   at System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height)
   at System.Windows.Forms.Control.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
   at System.Windows.Forms.Form.SetBoundsCore(Int32 x, Int32 y, Int32 width, Int32 height, BoundsSpecified specified)
   at System.Windows.Forms.Control.ScaleControl(SizeF factor, BoundsSpecified specified)
   at System.Windows.Forms.ScrollableControl.ScaleControl(SizeF factor, BoundsSpecified specified)
   at System.Windows.Forms.Form.ScaleControl(SizeF factor, BoundsSpecified specified)
   at System.Windows.Forms.Control.ScaleControl(SizeF includedFactor, SizeF excludedFactor)
   at System.Windows.Forms.ContainerControl.Scale(SizeF includedFactor, SizeF excludedFactor, Control requestingControl, Boolean causedByFontChanged)
   at System.Windows.Forms.ContainerControl.PerformAutoScale(Boolean includedBounds, Boolean excludedBounds, Boolean causedByFontChanged)
   at System.Windows.Forms.ContainerControl.OnLayoutResuming(Boolean performLayout)
   at System.Windows.Forms.Control.ResumeLayout(Boolean performLayout)
   at DuplicatesFinder.FormAccept.InitializeComponent()
   at DuplicatesFinder.FormAccept..ctor()
   at DuplicatesFinder.Program.Main()
 
Назад
Сверху Снизу