![]() |
Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Guten Abend zusammen...
ich arbeite grade an einem kleinen Projekt für das MMORPG "World of Warcraft". Eigentlich macht dieses kleine Tool nichts weiter als den "Cache" Ordner und *.bak's aud diversen Unterordnern des WoW Verzeichnisses zu löschen um die Ladezeiten zu verkürzen... danach startet es dann den normalen WoW-Launcher und beendet sich danach selber. bis jetzt hat alles gut geklappt... sachen wie:
Delphi-Quellcode:
und so liefen wie geschmiert...
reg.Access := KEY_READ;
Reg.OpenKey('\Software\Blizzard Entertainment\World of Warcraft\', false); GamePath:=Reg.ReadString('InstallPath'); auch
Delphi-Quellcode:
funktioniert ganz okay... auch wenns bestimmt besser geht... es erfüllt seinen Zweck.
procedure TForm1.FileSearch(const PathName, FileName : string; const InDir : boolean);
var Rec : TSearchRec; Path : string; begin Path := IncludeTrailingBackslash(PathName); if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then try repeat DeleteFile(Path + Rec.Name); if not FileExists(Path + Rec.Name) then form3.ListBox1.Items.Add(Path + Rec.Name); if form3.ListBox1.Items.count > 2 then form3.Label1.Caption:= inttostr(form3.ListBox1.Items.Count) + ' Dateien gelöscht'; if form3.ListBox1.Items.count = 1 then form3.Label1.Caption:= inttostr(form3.ListBox1.Items.Count) + ' Datei gelöscht'; SetHorizontalScrollBar(form3.ListBox1) ; form3.Button1.Enabled:=false; until FindNext(Rec) <> 0; finally FindClose(Rec); end; If not InDir then Exit; if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then try repeat if ((Rec.Attr and faDirectory) <> 0) and (Rec.Name<>'.') and (Rec.Name<>'..') then FileSearch(Path + Rec.Name, FileName, True); until FindNext(Rec) <> 0; finally FindClose(Rec); end; form3.Button1.Enabled:=true; end; Doch jetzt bin ich an dem Punkt, wo ich die "procedure TForm1.FileSearch" umbasteln muss, oder ne ganz andere brauche, denn ich möchte jetzt im "Path\Interface\Addons\" nach den *.toc's der installierten Addons suchen und diese dann auflisten um sie auf aktualität zu überprüfen... für die die nicht wissen wie so eine TOC aufgebaut ist: --- ## Interface: 30300 ## Title: TweakWoW ## Author: xXx ## Version: 1.0 ## Notes: ... ## DefaultState: Enabled ## LoadOnDemand: 0 ## SavedVariables: AutoSellGreys, AutoRepair TweakWoW.xml --- Jetzt erkennt man schon dass ich in der zeile die zeichen nach "## Version: " suchen muss... das sollte später auch nicht das problem sein... Jetzt also zu meinem Problem. Wie gesagt ich befinde mich zurzeit im Ordner "Path\Interface\Addons\". Wenn ich jetzt die TOC von oben finden möchte muss ich in "Path\Interface\Addons\TweakWoW\" suchen und ich werde fündig. Jedoch gibt es andere Addons die weitere Unterordner beinhalten und in diesen befinden sich auch TOC's. Diese möchte ich aber bei einer Suche NICHT finden. Es geht mir nur um diese: "Path\Interface\Addons\ADDONNAME\ADDONNAME.TOC " Ich bin mir ziemlich sicher, dass ich mit der rekursiven Suche relativ nahe dran bin, jedoch habe ich nichts gefunden, womit ich die Unterordnertiefe bei einer suche einstellen kann... Vielen Dank schonmal an hilfreiche Antworten :) MFG Floddy |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Statt dem Parameter InDir:Boolean nimmst du einfach den Parameter Tiefe:integer.
Jedesmal, wenn du rekursiv ein Verzeichnis hinabsteigst wird die Tiefe ums Eins verringert.
Delphi-Quellcode:
// procedure TForm1.FileSearch(const PathName, FileName : string; const InDir : boolean); // alt
procedure TForm1.FileSearch(const PathName, FileName : string; Tiefe:integer); // neu ... // If not InDir then Exit; // alt if Tiefe <= 0 then Exit; // neu ... // FileSearch(Path + Rec.Name, FileName, True); // alt FileSearch(Path + Rec.Name, FileName, Tiefe-1); // neu |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Ich würde so vorgehen:
Alle Verzeichnisse des Ordners AddOns, die nicht mit "Blizzard_" beginnen, in eine TStringList einlesen und diese dann durchgehen und in jedem dieser Verzeichnisse nach *.toc suchen. |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Die Komponente
![]() Zitat:
Zitat:
-- Andreas |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Zitat:
Zitat:
Zitat:
Vielen dank nochmal an die guten antworten. Ich meld mich nochmal wenn ich mich entschieden habe wie ichs mach... |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Hallo nochmal... wie versprochen jetzt nochmal meine Lösung wie ich sie am leichtesten und meiner meinung nach am sinnvollsten umgesetzt habe...
Delphi-Quellcode:
bewusst im FormShow, damit wirklich jedes mal nach neuen Ordnern gesucht wird...
procedure TForm5.FormShow(Sender: TObject);
var searchResult : TSearchRec; begin SetCurrentDir(form1.gamepath + '\Interface\Addons'); listbox1.Clear; if FindFirst('*.*', faDirectory, searchResult) = 0 then begin repeat if (searchResult.attr and faDirectory) = faDirectory then if LeftStr(searchResult.Name, 9)='Blizzard_' then else ListBox1.Items.Add(searchResult.Name); until FindNext(searchResult) <> 0; FindClose(searchResult); ListBox1.Items.Delete(0); ListBox1.Items.Delete(0); end; end; natürlich hab ich die "Blizzard_" ordner überspringen lassen ;) und nun zu den TOCs um die es ja eigentlich geht...
Delphi-Quellcode:
interesant dafür sind hier nur die fett markierten zeilen... der rest dient eigentlich nur dazu, aus der TOC dann die Interfaceversion zu lesen und diese dann in einem LabeledEdit darzustellen um sie nach einem interfaceveränderndem Patch nicht umständlich toc für toc ändern zu müssen über einen texteditor.
procedure TForm5.ListBox1Click(Sender: TObject);
var i: integer; versioncheck: integer; begin [b]if FileExists(form1.gamepath + 'Interface\Addons\' + ListBox1.Items[ListBox1.ItemIndex] + '\' + ListBox1.Items[ListBox1.ItemIndex] + '.toc') then[/b] begin LabeledEdit1.Text:=''; memo1.Lines.Clear; [b]tocpath:=form1.gamepath + 'Interface\Addons\' + ListBox1.Items[ListBox1.ItemIndex] + '\' + ListBox1.Items[ListBox1.ItemIndex] + '.toc';[/b] memo1.Lines.LoadFromFile(tocpath); for i:= 0 to Memo1.Lines.Count-1 do begin if LeftStr(memo1.Lines[i], 14)='## Interface: ' then begin LabeledEdit1.Text:=MidStr(Memo1.Lines[i], 15, Length(memo1.Lines[i])); versioncheck:=strtoint(LabeledEdit1.Text); if versioncheck <> 30300 then LabeledEdit1.Color:= clRed else LabeledEdit1.Color:= clGreen; versionline:=i; end; if LeftStr(memo1.Lines[i], 17)='## Interface: ' then begin LabeledEdit1.Text:=MidStr(Memo1.Lines[i], 18, Length(memo1.Lines[i])); versioncheck:=strtoint(LabeledEdit1.Text); if versioncheck <> 30300 then LabeledEdit1.Color:= clRed else LabeledEdit1.Color:= clGreen; versionline:=i; end; end end end; blöd daran ist nur, dass beim Speichern...
Delphi-Quellcode:
...die neue Zeile ans Ende der TOC gehängt wird und ich keine Möglichkeit gefunden habe die zeile aus der die interfaceversion gelesen wird einfach zu überschreiben... beeinflusst nicht die Funktionalität, sieht aber unschön aus am ende ;)
procedure TForm5.Button2Click(Sender: TObject);
begin if LabeledEdit1.Text<>'' then memo1.Lines.Delete(versionline); memo1.Lines.Add('## Interface: ' + LabeledEdit1.Text); Memo1.Lines.SaveToFile(tocpath); end; Wem dazu noch etwas einfällt der kanns ja gerne hier posten. MFG Floddy EDIT::: sorry übrigens fürs Doppelpost. |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Zitat:
Das selbe mache ich auch, wenn ich Google Earth starte. Ich starte erst ein Batch-File, dieses löscht den Cache, startet dan Google Earth und dann beendet sich es wieder. Weniger als 5 Zeilen :D |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Delphi-Quellcode:
Wäre das nicht möglich?
procedure TForm5.Button2Click(Sender: TObject);
begin if LabeledEdit1.Text<>'' then memo1.Lines[versionline]:='## Interface: ' + LabeledEdit1.Text; //memo1.Lines.Add('## Interface: ' + LabeledEdit1.Text); Memo1.Lines.SaveToFile(tocpath); end; Dann stände es anstelle des alten Textes in der originalen Zeile :) |
Re: Ordner rekursiv durchsuchen bis zu maximaler Tiefe
Hi,
schau mal hier ( ![]() Gruß, Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz