Einzelnen Beitrag anzeigen

Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#7

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 20:42
Das Prog benennt Dateien um. Man kann auswählen, ob man Dateien, Verzeichnisse oder beide auf einmal bearbeiten lassen will. Außerdem geht das ganze auch in die Verzeichnisse rein.

Folgende ist die rekursive Suchprozedur, eingebettet in die "Suchinterface-Prozedur". Variablen, die hier nicht deklariert sind, stehen in der übergeordneten.
Delphi-Quellcode:
procedure suche(pfad:string);
var slDirDirs:tStringList; c:integer;
begin
  slDirFiles.clear; slDirDirs:=tStringList.create;

  if filenames then begin // Dateien sollen gesucht werden
    i:=findfirst(pfad+fm.egMaske.text,$67,attribs); // Dateien suchen
    while (i=0) and (fm.aTest.tag=1) do begin // aTest.tag=0 ist Abbruch (Button gedrückt)
      application.processMessages;
      slDirFiles.Add(pfad+attribs.name); // sl* sind Stringlists
      inc(cFiles); // Zählvari für spätere Statistik
      i:=findnext(attribs)
    end;
    if fm.cbSorted.Checked then slDirFiles.Sort // ggf. sortieren, wenn angekreuzt
  end;
  findclose(attribs);

// Und das ganze nochmal für Verzeichnisse
// Habe schon probeweise den oberen Teil rausgenommen, half aber nichts

  i:=findfirst(pfad+fm.egMaske.text,$10,attribs); // Verzeichnisse suchen
  while (i=0) and (fm.aTest.tag=1) do begin
    if ((attribs.name<>'.') and (attribs.name<>'..')) then begin
      application.processMessages;
      slDirDirs.Add(pfad+attribs.Name+'\'); // der \ markiert den Pfad in der Liste als Verzeichnis
    end;
    i:=findnext(attribs)
  end;
  findclose(attribs);
  if fm.cbSorted.Checked then slDirDirs.Sort;

  slDateien.AddStrings(slDirFiles); // Dateien in die globale Liste übernehmen
  if Recurse then
  for c:=0 to slDirDirs.count-1 do suche(slDirDirs[c]); // Rekursiv in Unterverzeichnisse gehen
  if dirNames then begin // Verzeichnisse in die Liste aufnehmen?
    slDateien.addStrings(slDirDirs); // dann auch deren Namen in die globale Liste schreiben
    inc(cDirs,slDirDirs.count)
  end;
  slDirDirs.free
end;
Das Problem ist jetzt, daß die Suche nach Verzeichnissen auch Dateien mit anfügt, obwohl ich nur nach Verzeichnissen suchen lasse (besagtes $10). Zur Laufzeit eindeutig daran zu erkennen, daß in der Liste hinter einem Dateinamen ein \ angefügt ist. Also Statt "Datei.txt" kommt dann "Datei.txt\". Und wenn ich auch nach Dateien suche, dann steht demzufolge einmal "Datei.txt" drin UND noch "Datei.txt\".


So, ich fahr jetzt erstmal nach Hause. Schüss
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat