Bardzo nie lubię takich programów, które zaśmiecają rejestr i nawet po ich usunięciu zostawiają w nim swoje klucze.
Wyjściem jest FORMAT C:, ale komu się chce instalować wszystko od nowa?
Wpadłem na pomysł napisania aplikacji która usuwa takie "śmieci".
Schemat jej działania (bez szczegółów):
1. Robi kopię rejestru.
2. Instaluje jakiś program.
3. Robi drugą kopię rejestru.
4. Porównuje obydwie kopie i wyświetla klucze nie znalezione we
wcześniejszej kopii.
Odnośnie tego projektu mam parę pytań :
1. Czy można w miarę szybko zrobić kopię rejestru.
2. Czy jest szybszy sposób porównania 2 dość dużych plików (kopia
rejestru - u mnie 9,30 MB) niż wymyślony przeze mnie :
procedure TForm1.StartBtnClick(Sender: TObject);
var
Plik1,Plik2 : TextFile; * Pliki - pierwsza i druga kopia rejestru.
S1, S2 : String; * Zmienne z tekstem do porównania.
Find : Boolean; * Zmienna "Czy znaleziono szukaną wartość (s1 = s2);
begin
Postep.Progress := 0; *nie ważne
lb1.Clear; * wyczyść ListBox
Stop := False; *Zmienna globalna "czy ktoś nacisnął przycisk Stop" na False
Find := False; *Chyba nie trzeba tłumaczyć
AssignFile(Plik1,Edit1.Text); * Skojarz zmienną plikową z plikiem (Tekstem w Edit1).
AssignFile(Plik2,Edit2.Text); * ------------------------------||------------------------------
Reset(Plik2); * Otwórz nowszą kopię
try
while not Eof(Plik2) and (Stop = False) do * dopuki nie koniec pliku i Stop = False;
begin
Application.ProcessMessages; *Daj odpocząć win... cośtam
Readln(Plik2,S2); *Odczytaj linijkę z nowszej kopii
Reset(Plik1); *Otwórz plik 1 (starsza kopia)
while not (eof(Plik1)) and (Find = False) and (Stop = False) do *to samo co 5
* linijek temu tyle że inny plik i
*jeśli jeszcze nie znaleziono (S2 <> S1 to Find = False)
begin
ReadLn(Plik1,S1); *Odczytaj linijkę z starszej kopii
if (S2 = S1) then * Jeśli linijka nowa jest w starej kopii to
Find := True else * Znaleziono - przerwij pętlę
Find := False; * jeśli nie znaleziono szukaj dalej
Postep.Progress := Postep.Progress + 1; * nie ważne
if (Postep.Progress = Postep.MaxValue) then * nie ważne
Postep.Progress := 0; *Nie ważne
end;
CloseFile(Plik1); *zamknij plik1 - starszy
if (Find = False) and (Stop = False) then * jeśli pętla(wewnętrzna) się
* skończyła i nie znaleziono
lb1.Items.Add(s2); *to dodaj linijkę (S2) do ListBox
end;
if Eof(Plik2) then * jeśli koniec nowego pliku
ShowMessage('Skanowanie zakończone'); *to wyświetl napis "Skan..."
finally
CloseFile(plik2); //zamknij Plik 2
end;
To działa dobrze ale czy nie dało by się szybciej?
Bo przy pliku 9 Mb...
Można by było pomijać linijki z Pliku 1, które mają odpowiednik w pliku 2, bo ta pętla każdą linijkę 2 pliku porównuje z KAŻDĄ 1 pliku, a wiadomo że jeśli S1 było równe S2 w poprzednim przebiegu pętli to teraz to samo S1 <> od nowego S2
I Jeszcze jedno : Jak pobrać ilość linijek w TextFile.
Piotrek, znaczy Gal Anonim.