文件查找问题(50分)

  • 主题发起人 tianzhegs
  • 开始时间
T

tianzhegs

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在一个固定目录下通过输入文件名查找文件,如果文件存在就显示在filelistbox中,
那位高手帮我解决一下,谢谢了
 
var
SearchRec: TSearchRec;
begin
if FindFirst('C:/WINDOWS/*.INI', attributes, SearchRec) = 0 then
begin
repeat
// 这里我们处理找到的每一个文件。
// 它的消息在SearchRec中。
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var data:TWin32FindData;
begin
if Button1.Caption='查找文件' then begin
handle:=FindFirstFile(PChar(Edit1.Text),data);
ShowFileInfo(data);
Button1.Caption:='查找下一个';
end
else begin
if NOT FindNextFile(handle,data) then begin
Windows.FindClose(handle);
Button1.Caption:='查找文件';
end
else ShowFileInfo(data);;
end;
end;
function TForm1.ShowFileInfo(data:TWin32FindData);
begin
//对data进行处理
end;
 

比较简单的方法是用FileExists
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
FileCtrl, StdCtrls;

type
TForm1 = class(TForm)
FileListBox1: TFileListBox;
DirectoryListBox1: TDirectoryListBox;
DriveComboBox1: TDriveComboBox;
FilterComboBox1: TFilterComboBox;
Edit: TEdit;
Button1: TButton;
procedure FileListBox1Change(Sender: TObject);
procedure DriveComboBox1Change(Sender: TObject);
procedure DirectoryListBox1Change(Sender: TObject);
procedure FilterComboBox1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure EditKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
searched:boolean;
implementation

{$R *.DFM}

procedure TForm1.FileListBox1Change(Sender: TObject);
begin
DirectoryListBox1.Drive:=DriveComboBox1.Drive;
FileListBox1.Drive:=DriveComboBox1.Drive;
FileListBox1.Directory:=DirectoryListBox1.Directory;
DriveComboBox1.Drive:='c';
DirectoryListBox1.Directory:='c:/video';
end;

procedure TForm1.DriveComboBox1Change(Sender: TObject);
begin
DriveComboBox1.Drive:='c';
end;

procedure TForm1.DirectoryListBox1Change(Sender: TObject);
begin
DirectoryListBox1.Directory:='c:/video';
end;

procedure TForm1.FilterComboBox1Change(Sender: TObject);
begin
FileListBox1.Mask:=FilterComboBox1.Mask;
FileListBox1:=FilterComboBox1.FileList;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
searchrec:tsearchrec;
begin
searched:=true;
filelistbox1.Items.Clear;
findfirst(edit.text+'*.mpg',faanyfile,searchrec);
filelistbox1.Items.Add(searchrec.name);
while findnext(searchrec)=0 do
filelistbox1.Items.Add(searchrec.name);
end;

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
button1click(sender);
end;

end.
 
实现方法:

1. 获取当前目录下的所有下一级子目录,
2. 存入字符串列表中(Tstrings)。
其中,用到了几个API函数。
FindFirst是找出指定目录下第一个文件或目录。
FindNext一般和FindFirst配合使用,用来找出下一个文件或目录。
FindClose用来关闭查询。
(以上函数Delphi在线帮助中有详尽解释,在此不赘述);
3. 用FileExists函数查找当前目录,
4. 寻找是否有满足条件的文件存在。
5. 依次使各个子目录成为当前目录,
6. 递归调用本函数。
7. 释放资源,8. 返回查询结果。

代码如下:

1. 从搜索记录中判断是否是子目录。
function IsValidDir(SearchRec:TSearchRec):Boolean;
begin
if (SearchRec.Attr=16) and
(SearchRec.Name<>'.') and
(SearchRec.Name<>'..') then
Result:=True
else
Result:=False;
end;

2. 这是查询主体函数。
参数介绍:
Mainpath: 指定的查询目录。
Filename: 欲查询的文件。
Foundresult: 返回的含完整路径的匹配文件(可能有多个)。
如果有匹配文件,函数返回True,否则,返回False;
function SearchFile(mainpath:string;filename:string;
var foundresult:TStrings):Boolean;
var
i:integer;
Found:Boolean;
subdir1:TStrings;
searchRec:TsearchRec;
begin
found:=false;
if Trim(filename)<>'' then
begin
subdir1:=TStringList.Create;//字符串列表必须动态生成
//找出所有下级子目录。
if (FindFirst(mainpath+'*.*', faDirectory, SearchRec)=0) then
begin
if IsValidDir(SearchRec) then
ubdir1.Add(SearchRec.Name);
while (FindNext(SearchRec) = 0) do
begin
if IsValidDir(SearchRec) then
subdir1.Add(SearchRec.Name);
end;
end;
FindClose(SearchRec);
//查找当前目录。
if FileExists(mainpath+filename) then
begin
found:=true;
foundresult.Add(mainpath+filename);
end;
//这是递归部分,查找各子目录。
for i:=0 to subdir1.Count-1 do
found:=Searchfile(mainpath+subdir1.Strings+'/',Filename,foundresult)or found;
//资源释放并返回结果。
subdir1.Free;
end;
result:=found;
end;
 
多人接受答案了。
 
顶部