如何在指定目录中找出含有关键字的若干文件呢?(100分)

  • 主题发起人 主题发起人 galahad
  • 开始时间 开始时间
G

galahad

Unregistered / Unconfirmed
GUEST, unregistred user!
各位朋友,我因工作需要经常会在大量的word和excel文档中查找具有某个关键字的相
关资料,(如在某个目录中有几百个word,excel,wps文件,其中有几个是含有“张三”
的信息的)我想做这样一个小程序,输入欲查询的关键字如“张三”即把所有内容中与
“张三”有关的文件找出来,我去查看这几个文件就行了,这样就免去我找“张三”资
料时挨个打开好几百个文件的痛苦了。可我不知该如何下手,我该如何实现呢?
 
给你个思路:
1。用findfirst、findnext、findclose结构查找出该目录下的所有相关文件;
2。用stringlist依次装入这些文件;
3。Pos一下关键字;
4。列出符合条件的文件名。
我在自己的一个小程序里实现了这个功能,但只适用文本类型文件。WORD恐怕不行。
 
用TFileListBox类查找出一定后缀名的文件,放在StringList中.
或者看看filectrl.pas(TFileListBox的源码)里面procedure ReadFileNames是怎么写的.
照着写一个查找名字当中有固定字符串的filename.
就如同楼上所说.
 
iseek,能给我一个例子吗
yumq@163.com
 
nethero,下面是例子
function IsValidDir(SearchRec:TSearchRec):Boolean; //这个函数验证有效的Dir
begin
if (SearchRec.Attr=16) and (SearchRec.Name<>'.') and
(SearchRec.Name<>'..') then Result:=True else
Result:=False;
end;

procedure SearchFilesOfDir(path:string;mask:string;Fsn:string;sub:Boolean);
var Dirs,Fs:TStrings;//这是我自己写的一个搜索过程,参数sub是指是否包含子目录
searchRec,SR:TsearchRec;
i,found:integer;
begin
Dirs:=TStringList.Create;
Fs:=TStringList.Create;
Dirs.Add(path);//先加入当前目录
if sub=true then
begin
if (FindFirst(path+'*.*', faDirectory, SearchRec)=0) then
begin
if IsValidDir(SearchRec) then Dirs.Add(path+SearchRec.Name);
while (FindNext(SearchRec) = 0) do
begin
if IsValidDir(SearchRec) then Dirs.Add(path+SearchRec.Name);
end;
end;
FindClose(SearchRec.FindHandle);
end;

for i:=0 to Dirs.Count - 1 do
begin
if Dirs.Strings[length(Dirs.Strings)]<>'/' then
Dirs.Strings:=Dirs.Strings+'/';
Fs.Add(Dirs.Strings);
found:=FindFirst(Dirs.Strings+'*.*',faAnyFile,SR);
while found=0 do
begin
if (SR.Name<>'.') and (SR.Name<>'..') and
(pos(ExtractFileExt(SR.Name),mask)>0) then
Fs.Add(Dirs.Strings+SR.Name);
found:=FindNext(SR);
end;
FindClose(SR.FindHandle);
end;

if pos(getfolder('Favorites')+'/',Fs.Text)>0 then
for i:=1 to Fs.Count - 1 do
begin
if Fs.Strings[length(Fs.Strings)]='/' then
begin
Fs.Strings:= wreplacing(Fs.Strings,path,'');
Fs.Strings:= wreplacing(Fs.Strings,'/','');
end;
end;
Fs.SaveToFile(Fsn);
Fs.Free;
Dirs.Free;
end;
==============================================================
var Dir:string;
ts, hp: tstrings;
i: integer;
begin
Dir:=BrowseFolder;//这是浏览目录函数
if Dir='' Then exit;
waitTitle;//操作开始时标题栏改变,这个过程是我自己写的,你不用管
if Dir[Length(Dir)]<>'/' then Dir:=Dir+'/';
if sender=txt2htmAll then//txt2htmAll是Button名,包含子目录
SearchFilesOfDir(Dir,'.txt',appPath + 'txt2htm.txt',true) else
if sender=txt2htmAllnoSub then//txt2htmAllnoSub也是Button名,不包含子目录
SearchFilesOfDir(Dir,'.txt',appPath + 'txt2htm.txt',false);//搜索结果保存到txt2htm.txt文件

ts := tstringlist.create;
hp := tstringlist.create;
ts.LoadFromFile(appPath + 'txt2htm.txt');
for i:=0 to ts.Count - 1 do
begin
if FileExists(ts.Strings) then
begin
hp.LoadFromFile(ts.Strings);
hp.Text:=txt2htm(hp.Text);//txt2htm(s:string):string是我自己写的函数,你不用管
hp.SaveToFile(replacing(ts.Strings,extractFileExt(ts.Strings),'.htm'));
hp.Text :='';
end;
end;
ts.Free;
hp.Free;
endWait;//操作结束时标题栏还原
Application.MessageBox('任务完成。 ', '提示信息', MB_OK);
end;
//上面是我自己实现的一个将某个目录(可以包含子目录)下的所有txt文件转换
为htm文件的例程。
希望对你有帮助
 
procedure TForm1.FindFileName(FindStr, DirStr, MaskStr: String; Memo: TMemo);
var
FileList : TFileListBox;
I : Integer;
begin
Memo.Lines.Clear;
FileList := TFileListBox.Create(Self);
FileList.Parent := Form1;
FileList.Visible := False;
FileList.Mask := MaskStr;
FileList.Directory := DirStr;
if FileList.Count <= 0 then exit;

for I := 0 to FileList.Count - 1 do
if Pos(FindStr, FileList.Items.Strings) > 0 then
Memo.Lines.Add(FileList.Items.Strings);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FindFileName('张三','D:/','*.doc',Memo1);
end;
 
《delphi5开发人员指南》上有个例子的----Delsearch

用多线程工作的呵!

功能和你要求的一样!

如何想要的话,可到ftp://book:book@202.117.210.31/delphi5b3.rar 下载

如果单想要那个例子。留下信箱有空发给你。

 
《delphi5开发人员指南里有个例子的----delsearch
用多线程工作,功能和你的要求一样。
如何想要的话,可在ftp://book:book@202.117.210.31/delphi5b3.rar下载此书的电子版(83M)。
不过如果单想要那个例子的话,留下信箱有空发给你呵!
 
我想提问者是想找出哪些文件内容里面包含有“张三”“李四”的文件来,而非文件名
吧?
你可以通过WINDOWS自带的文件查找功能来搜索,在“包含文字”文本框里
输入要包含的文字即可。但是所包含的文字只能是文本文字,WORD文件似乎可以,
如果是EXCEL文件好象就不行了。我试了一下分别在一个新WORD文件和新EXCEL文件
输入“张三”,保存,去查找只能找出WORD文件,而EXCEL文件没法找出,用记事本
分别打开只能在WORD文件中找到“张三”字样,在EXCEL文件中不能。
要做到你要实现的功能也是可以的,最简单的方法就是在程序中使用TWORDAPPLICATION、
TEXCELAPPLICATION两类服务程序,然后调用相应的方法。至于WPS要看它的文件结构了。



 
那个例子就是用来查找各个文件里的字符串的

前面的说错了
例子名应为:delsrch
 
zhihuali的是正解,大家不用讨论了,是不是问问题的人早忘了,考.
 
var
arec: TSearchRec;
begin
findfirst('c:/*sd*.*',faAnyFile,arec);
if Pos('.',arec.Name)<>1 then
combobox1.Items.Add(arec.Name);
try
while findnext(arec)=0 do
begin
if Pos('.',arec.Name)<>1 then
combobox1.Items.Add(arec.Name);
end;
finally
findclose(arec);
end;
end
 
bubble,注意人问的是文件内容里的关键字,可zhihuali给出的是搜索标题里的关键字,
这差别你看不出来吗?
凭什么说他的是正解。
说我的是正解还差不多。
呵呵。
 
后退
顶部