Solved

Find a file

Posted on 2001-08-02
13
149 Views
Last Modified: 2012-05-04
Rather than reinvent the wheel, I am wondering if there is any source code or component that would perform a function similar to "Start > Find > Files or Folders"?  I need a way to present a simple user interface that would allow the user to search for a file wild card, and have any matches listed.
0
Comment
Question by:Monroe406
  • 6
  • 3
  • 3
  • +1
13 Comments
 
LVL 6

Expert Comment

by:edey
ID: 6347362
how about:

function search(base,mask : string);
var
 sr : TSearchRec;
 result : integer;
begin
 result := findFirst(base+mask,faAnyFile,sr);
 while sr = 0 do
 begin
  if (sr.attr and faDirectory > 0)and(sr.name <> '.')and(sr.name <> '..') then
   search(base+sr.name+'\',mask)
  else if sr.attr and faDirectory <= 0 then
   form1.listBox1.items.add(base+sr.name);
  result := findNext(sr);
 end;
 findClose(sr);
end;

ex.: search('c:\','*.pas') would find _all_ .pas files on drive c:.  Base needs to end with a '\' & mask is any file mask.

Please note that this is completely untested, written "on the fly".

GL
Mike
0
 
LVL 44

Expert Comment

by:CrazyOne
ID: 6347366
Well if you have D5 you can go to the Component bar and under the Dialogs tab you will find a "Find Dialog" component ready and willing to the the job. :>)


The Crazy One
0
 
LVL 5

Expert Comment

by:scrapdog
ID: 6347374
You would use FindFirst and FindNext to do this.

First, you declare a variable of type TSearchRec (this will be used to store the search results).

var
   SearchRec :TSearchRec;


Then you call FindFirst.  The parameters for FindFirst are

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;


Pass the filename into Path, the attributes into Attr, and the SearchRec into F.


if (FindFirst('c:\windows\desktop\*.*', faAnyFile, SearchRec) = ) then

The attributes can be any of all of the following:

faReadOnly     $00000001     Read-only files
faHidden     $00000002     Hidden files
faSysFile     $00000004     System files
faVolumeID     $00000008     Volume ID files
faDirectory     $00000010     Directory files
faArchive     $00000020     Archive files
faAnyFile     $0000003F     Any file

If you want two or more attributes, you "or" them with each other (or add them).

FindFirst returns 0 if a file is found, otherwise it returns a Windows error code.

Now SearchRec will contain the first instance of the file found.

SearchRec is defined as follows:

TSearchRec = record
          Time: Integer;
          Size: Integer;
          Attr: Integer;
          Name: TFileName;
          ExcludeAttr: Integer;
          FindHandle: THandle;
          FindData: TWin32FindData;
end;

You can get any information you need from SearchRec.


To continue looking for more files, call FindNext.

while (FindNext(SearchRec) = 0) do begin
  //do something with the searchrec here
end;

FindNext will return 0 every time a file is found again.  When it returns a non-zero number, then all of the files have been found (or none of them due to an error).


After this loop, call FindClose.

FindClose(SearchRec)


Here is an example of it all put together.  This will put any file (aside from system files) that match the criteria into a StringList.


procedure Find(Filename :TFilename;  List :TStringList);
var
  SearchRec :TSearchRec;
begin
    if (FindFirst(Filename, faAnyFile - faSystemFile, SearchRec) = 0) then begin
     List.Add(SearchRec.Name);
        while(FindNext(SearchRec) = 0) do
            List.Add(SearchRec.Name);
        FindClose(SearchRec);
    end;
end;

Check in the Delphi help for FindFirst, FindNext, and FindClose for more info.
0
 
LVL 44

Expert Comment

by:CrazyOne
ID: 6347375
Oops sorry misread the question. :>)
0
 
LVL 5

Expert Comment

by:scrapdog
ID: 6347376
edey:  forgive me, didn't see your post when I posted this
0
 
LVL 44

Accepted Solution

by:
CrazyOne earned 100 total points
ID: 6347385
There are a few components on this page that my fit your needs.

http://www.torry.net/search.htm
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 5

Expert Comment

by:scrapdog
ID: 6347388
E-E is not "thread safe" =)
0
 

Author Comment

by:Monroe406
ID: 6347408
>> You would use FindFirst and FindNext to do this.

Thanks "scrapdog", but your sample does not iterate through subfolders.
0
 

Author Comment

by:Monroe406
ID: 6347410
>> while sr = 0 do

Thanks "edey", but the above line will not compile.
0
 

Author Comment

by:Monroe406
ID: 6347411
>> Well if you have D5

I am using Delphi 3
0
 
LVL 5

Expert Comment

by:scrapdog
ID: 6347456
>Thanks "scrapdog", but your sample does not iterate through subfolders.

If you want it to recurse into subfolders, hang on a few minutes.  I'll give you some code.
0
 
LVL 5

Expert Comment

by:scrapdog
ID: 6347499
Well, maybe not. =)
0
 
LVL 5

Expert Comment

by:scrapdog
ID: 6347512
Here is the code anyway:


procedure TForm1.Recurse(BasePath :TFilename; Criteria :TFilename;  ListBox :TListBox);
var
    SearchRec :TSearchRec;
    Directories :TStringList;
    i :integer;

    procedure AddDirectory(Name :string);
    begin
        if (Name <> '.') and (Name <> '..') then Directories.Add(Name);
    end;

    procedure AddFile(const SearchRec :TSearchRec);
    begin
        if (SearchRec.Attr and faDirectory) = 0 then
            ListBox.Items.Add(BasePath + SearchRec.Name);
    end;

begin
    if BasePath[Length(BasePath)] <> '\' then BasePath := BasePath + '\';

    //get subdirectories
    Directories := TStringList.Create;
    if (FindFirst(BasePath + '*.*', faDirectory, SearchRec) = 0) then begin
        AddDirectory(SearchRec.Name);
        while(FindNext(SearchRec) = 0) do
            AddDirectory(SearchRec.Name);
        FindClose(SearchRec);
    end;

    if (FindFirst(BasePath + Criteria, faAnyFile, SearchRec) = 0) then begin
        AddFile(SearchRec);
        while(FindNext(SearchRec) = 0) do
            AddFile(SearchRec);
        FindClose(SearchRec);
        for i := 0 to Directories.Count - 1 do
            Recurse(BasePath + Directories[i], Criteria, ListBox);
        Directories.Free;
    end;

end;
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Delphi : could not find program, '...exe' 2 148
Run video youtube webbrowse 10 58
Delphi...Split view - idea? 1 42
PHP preg_replace code convert to Delphi 14 35
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
This tutorial gives a high-level tour of the interface of Marketo (a marketing automation tool to help businesses track and engage prospective customers and drive them to purchase). You will see the main areas including Marketing Activities, Design …
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

896 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now