Cleaner .NET – moduł do czyszczenia rejestru! | DSP 2017 #2

Prace nad projektem ruszyły na dobre! Wczoraj wgrałem na GitHuba commit’a, który wprowadza do aplikacji moduł służący do czyszczenia rejestru. Nie jest on oczywiście jakoś specjalnie rozbudowany, jednak wydaje się działać i spełniać swoją rolę. Zamierzam go oczywiście dalej rozwijać, dodając opcje przeszukiwania kolejnych kluczy rejestru pod kątem zbędnych wpisów. Okno tej zakładki programu prezentuje się teraz następująco:

Pokazane na screenie zbędne wpisy są dosyć dziwne, ponieważ usunąłem te faktycznie występujące w moim systemie i w ramach prezentacji wygenerowałem nowe osobiście. Ach to uczucie, kiedy sam sobie zaśmiecasz rejestr 😀

Ale… Jak to właściwie działa?

Na początku kompletnie nie wiedziałem jak podejść do zadania, jakim jest przeszukiwanie rejestru pod kątem występujących w nim zbędnych wpisów. Pierwsze co przyszło mi do głowy, to przeszukiwanie całego rejestru pod kątem tego typu wartości… Szybko mi jednak przeszło, ponieważ nie dosyć, że to dosyć niebezpieczne działanie, to do tego masakrycznie wolne. Poza tym, nie miałem pojęcia, na jakiej podstawie mam stwierdzać, który wpis/klucz jest zbędny. Pomogło mi trochę podpatrzenie, jak radzą sobie z tym zadaniem inne programy tego typu. Dzięki nim znalazłem kilka kluczy, w których najczęściej znajdują się zbędne wpisy. Przeszukiwanie części z nich, już zaimplementowałem:

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
  • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted

Właściwie każdy z kluczy posiada swoją własną metodę, która odpowiada za jego przeszukanie(wszystkie zebrane są w klasie WindowsRegistryCleaner). W przypadku pierwszego klucza przeszukiwane są wszystkie jego podklucze. Każdy klucz w tej gałęzi przeznaczony jest dla jednego zainstalowanego w systemie programu. Problem w tym, że jeżeli programu w systemie już nie ma… to te wpisy tutaj i tak zostają. To czy dany klucz jest używany, ustalam odczytując jego wartość o nazwie „InstallLocation” i sprawdzając, czy przechowywana tam ścieżka do katalogu aplikacji istnieje – jeżeli nie, oznacza to, że cały klucz jest zbędny.

W przypadku pozostałych kluczy sprawa ma się bardzo podobnie, z tym że nie są przeszukiwane ich podklucze, a jedynie wartości. Tymi wartościami, również są ścieżki dostępu – tym razem do plików. Jeżeli plik wskazywany przez wartość, nie istnieje, to taki wpis jest zbędny – prosta sprawa. Jednak powyższe klucze, to tylko mała namiastka tego, co należałoby przeszukiwać… A inne klucze rejestru będą wymagać innej metodologi ich sprawdzania. Jednak nie będę martwić się na zapas. Jak to mówią: „Wszystko wyjdzie w praniu”.

Co dalej?

Bardzo dobre pytanie. Myślę, że najbliższe dni spędzę nad pisaniem metod przeszukujących kolejne podklucze rejestru. Kiedy uznam, że ich ilość będzie już w miarę zadowalająca, to wezmę się chyba, za poprawienie funkcji odpowiadającej za zapisywanie ustawień programu… Bo teraz wygląda dosyć nieelegancko – trzeba z tym zrobić porządek.

Przydałoby się też, żebym zainteresował się w końcu testami jednostkowymi… Nigdy takowych nie tworzyłem, więc chyba czas zacząć – chociaż szczerze mówiąc, za bardzo mi się nie chce. Mam jednak nadzieję, że kiedy już zacznę je pisać, to tak samo jak z MVVM – nie będę mógł się bez nich obejść 😉

Cóż, tyle ode mnie. Jeżeli chodzi o obsługę rejestru w C#, zdecydowałem że poświęcę temu zagadnieniu osobny wpis. Na koniec oczywiście, jak zwykle zachęcam Was do komentowania… i przejrzenia kodu, który doskonały na pewno nie jest 🙂

120 total views, 1 views today