Avatar billede dl Nybegynder
29. juni 2004 - 19:40 Der er 8 kommentarer og
1 løsning

Søgefunktion

Jeg har en component: FileSearch
Jeg har også en stumpkode:

procedure SaetBackSlash(var Mappe: string);
begin
  if Mappe[Length(Mappe)] <> '\' then
    Mappe := Mappe + '\';
end;

// Til at finde filerne:
function FindFiler(Mappe: string): string;
var
  SearchRec: TSearchRec;
  FindResult: Integer;
begin
  SaetBackSlash(Mappe);
  FindResult := FindFirst(Mappe + '*.*', faAnyFile, SearchRec);
  try
    // Søg først efter filer
    while FindResult = 0 do
    begin
      Inc(X,1);
      Form1.lbFiler.Items.Add(AnsiLowerCase(Mappe + SearchRec.Name));
      Form1.Label1.Caption := SearchRec.Name + ' - ' + IntToStr(SearchRec.Size) + ' - ' + IntToStr(X);
      Form1.Label1.Update;
      FindResult := FindNext(SearchRec);
    end;
    // Søg dernæst efter mapper
    FindResult := FindFirst(Mappe + '*.*', faDirectory, SearchRec);
    // Hvis mapperne ikke er '.' og '..',
    // så søg videre i disse mapper (rekursivt)
    while FindResult = 0 do
    begin
      if ((SearchRec.Attr and faDirectory) = faDirectory) and
        (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
        FindFiler(Mappe + SearchRec.Name);
      FindResult := FindNext(SearchRec);
    end;
  finally
    FindClose(SearchRec);
  end;
end;

og jeg har Windows Søgefunktion

------------------------

Mit problem
Min søgefunktion skal finde ALLE, og jeg MENER ALLE filer på en Harddisk eller en mappe.

Men de 3 søgefunktion jeg har fået fat i: Giver IKKE det samme resultalt.
Og jeg har checket om jeg tæller mapper med eller ej.

//dl

Jeg skal have en søge funktion som virker :)  hvor finder jeg sådan en ... eller laver den ?
Avatar billede dl Nybegynder
29. juni 2004 - 22:50 #1
Nu har jeg selv prøvet at stykke noget sammen.

<<< start >>>

Function Findfiles( Directory: String; FilterFiles: String; IncludeSubDir: Boolean ): Integer;
var
  SearchRec: TSearchRec;
  FindResult: LongInt;
begin
  FindResult := FindFirst(IncludeTrailingBackslash(Directory) + FilterFiles, faAnyFile + faDirectory, SearchRec);
  Try
    while FindResult = 0 do
    begin
      { Sikrer at det ikke er . eller .. bibloteket vi har fundet med en file }
      if (SearchRec.Attr = faAnyFile) and
        (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
      begin
        // If file, then ?
//        Findfiles(IncludeTrailingBackslash(Directory) + IncludeTrailingBackslash(SearchRec.Name), FilterFiles, IncludeSubDir);
// En listbox, hvor alle filer bliver vist.
        Form1.ListBox1.Items.Add(SearchRec.Name + ',' + IntToStr(SearchRec.Size) );
      end;

      { Sikrer at det ikke er . eller .. bibloteket vi har fundet
        Og IncludeSubDir = True }
      if (SearchRec.Attr = faDirectory) and
        (SearchRec.Name <> '.') and (SearchRec.Name <> '..') and
        ( IncludeSubDir = True ) then
      begin
        Findfiles(IncludeTrailingBackslash(Directory) + IncludeTrailingBackslash(SearchRec.Name), FilterFiles, IncludeSubDir);
      end;
      FindResult := FindNext(SearchRec);
    end;
  finally
    FindClose(SearchRec);
  end;
end;

<<< slut >>>

Hvor virker det ikke.

*Den finder filerne, med add dem ikke til min listbox
*Den finder ikke undermapper, hvorfor ?
Avatar billede dl Nybegynder
29. juni 2004 - 22:52 #2
Rettet:

Function Findfiles( Directory: String; FilterFiles: String; IncludeSubDir: Boolean ): Integer;
var
  SearchRec: TSearchRec;
  FindResult: LongInt;
begin
  FindResult := FindFirst(IncludeTrailingBackslash(Directory) + FilterFiles, faAnyFile, SearchRec);
  Try
    while FindResult = 0 do
    begin
      { Sikrer at det ikke er . eller .. bibloteket vi har fundet med en file }
      if (SearchRec.Attr and faAnyFile = faAnyFile) and
        (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
      begin
        // If file, then ?
//        Findfiles(IncludeTrailingBackslash(Directory) + IncludeTrailingBackslash(SearchRec.Name), FilterFiles, IncludeSubDir);
// En listbox, hvor alle filer bliver vist.
        Form1.ListBox1.Items.Add(SearchRec.Name + ',' + IntToStr(SearchRec.Size) );
      end;

      { Sikrer at det ikke er . eller .. bibloteket vi har fundet
        Og IncludeSubDir = True }
      if (SearchRec.Attr and faDirectory = faDirectory) and
        (SearchRec.Name <> '.') and (SearchRec.Name <> '..') and
        ( IncludeSubDir = True ) then
      begin
        Findfiles(IncludeTrailingBackslash(Directory) + IncludeTrailingBackslash(SearchRec.Name), FilterFiles, IncludeSubDir);
      end;
      FindResult := FindNext(SearchRec);
    end;
  finally
    FindClose(SearchRec);
  end;
end;



* Den finder filerne, med appender dem ikke ?
//dl
Avatar billede doc404 Novice
30. juni 2004 - 06:58 #3
...
if (SearchRec.Attr and faDirectory) = faDirectory then
  begin
    // got a folder
    if (SearchRec.Name <> '.') and (SearchRec.Name) <> '..') then
      FindFiles(Directory + '\' + SearchRec.Name,IncludeSubDir);
  end
else
  begin
    // got a file
  end;
...

sådan frit fra leveren (det der er tilbage) med skrigende unger omkring...
Avatar billede dl Nybegynder
30. juni 2004 - 10:51 #4
Efter jeg lige har rettet lidt på kode.

      if (SearchRec.Attr and faDirectory) = faDirectory then
      begin
        // got a folder
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') and ( IncludeSubDir = True ) then
        begin
          Findfiles(IncludeTrailingBackslash(Directory) + IncludeTrailingBackslash(SearchRec.Name), FilterFiles, IncludeSubDir);
        end
        else
        begin
          // got a file
          Form1.ListBox1.Items.Add(SearchRec.Name + ',' + IntToStr(SearchRec.Size) );
        end;
      end;


Så får jeg stadig ikke noget.
Det eneste den appender er:

.0
..0
.0
..0
.0
..0
.0

osv.


hvad fanden sker der ?

//dl
Avatar billede doc404 Novice
30. juni 2004 - 11:09 #5
Denne virker

Hvis du skal søge hele disken igennem skal du bruge *.* som filter maske..


procedure FindFiles(Folder : string);
var
  SearchRec : TSearchRec;
begin
  if FindFirst(Folder + '*.*',faAnyFile,SearchRec) = 0 then
    begin
      repeat
        if (SearchRec.Attr and faDirectory) = faDirectory then
          begin
            if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
              FindFiles(Folder + SearchRec.Name + '\');
          end
        else
          begin
            Form1.ListBox1.Items.Add(Folder + SearchRec.Name);

            // bare en bremse...
            if Form1.ListBox1.Items.Count > 200 then
              Break;
          end;
      until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindFiles('d:\prj\');
end;
Avatar billede dl Nybegynder
30. juni 2004 - 15:14 #6
Lige en ting til.
Hvis du kan svar på det.

Hvis jeg vil gemme alle de finder den finder, i fx: c:\mitdata.txt hvordan gør jeg så. Når jeg skal tage højde for at filen er åbnen flere gange ?

//dl
Avatar billede dl Nybegynder
30. juni 2004 - 18:01 #7
og indlæg lige et svar.
//dl
Avatar billede doc404 Novice
30. juni 2004 - 19:42 #8
Du behøver ikke åbne filen flere gange..
// global var eller i privte eller hvad du nu vil
var
  f : TextFile;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Assign(f,'c:\mitdata.txt');
  Rewrite(f);
  FindFiles('d:\prj\');
  CloseFile(f);
end;

og der hvor du normalt adder til listbox'en

  writeln(f,SearchRec.Name);
Avatar billede dl Nybegynder
30. juni 2004 - 19:59 #9
k, jeg viste ikke man lige kunne gøre det på den måde.
//dl
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester