当前位置:主页>销售管理软件> 列表

多线程文件搜索的问题,送上全部分了,在线等待!!!! 找超市管理软件免费版

仓库管理软件版1楼: 我的软件需要对某文件夹下面的文件进行搜索,我使用的是findfirst,findnext函数,在我自己机器和大多数用户的机器都上没有问题,但是有些用户说搜索有问题.有的说在搜索c:\windows\options\i386\label.ex_时候失去响应,但是我电脑里面根本没有i386目录,那个ex_后缀也不知道是什么文件类型,谁知道是什么原因啊?关键问题是有的机器可以有的不行,都是windows xp,包括sp1和sp2.(我在主线程基础上建立了一个自己的搜索线程)

2楼: 你的搜索只是按文件名搜索吗,还是按文件的内容搜索关键字?比如,找出文件内容含有www.delphibbs.com字符的文件. 如进销存管理系统论文

3楼: 如果你只是搜文件名的话,应该不会出现这样的问题.要打开文件查找内容的就会碰到有些文件拒绝访问,因为windows目录里面很多都是独占的系统文件.一般程序不能读写.

4楼: 我是搜索文件名,用了多线程,难道和多线程有关系?

5楼: 你怎么写的多线程,贴出来我帮你看看.

6楼: procedure TSearchFileThread.ScanTread(APath:string);
var
First,Second:boolean;
FSearchRec,
DSearchRec: TSearchRec;


FindResult,ori1: integer;
t:string;
n,i,m:integer;
TTItem:TTreeNode;
function IsDirNotation(ADirName: String): Boolean;
begin
Result := (ADirName = ''.'') or (ADirName = ''..'');
end;

begin
First:=False;
with Form1 do
begin
i:=0;
APath := GetDirectoryName(APath);
FindResult := FindFirst(APath+''*.*'',faAnyFile+faHidden + faSysFile+faReadOnly,FSearchRec);

try
while FindResult = 0 do
begin
if onoff=false then exit;
n:=GetFileCount(APath+DSearchRec.Name);
LPro.Caption:=IntToStr(StrToInt(LPro.Caption)+1);
LPro.Repaint;
Inc(i);

CurrentP.MaxValue:=CurrentP.MaxValue+1;
ori1:=(i*100) div n;
CurrentP.Progress:=(ori1*CurrentP.MaxValue) div 100;

TotalP.MaxValue:=TotalP.MaxValue+1;
TotalP.Progress:=TotalP.Progress+1;

LEntry.Caption:=LowerCase(APath+FSearchRec.Name);
LEntry.Repaint;
t:=ReadMyZip(LowerCase(APath+FSearchRec.Name),MyProcess);

LFound.Caption:=IntToStr(StrToInt(LFound.Caption)+1);
LFound.Repaint;
with ScanList.Items do
begin
TTItem:=Add(nil,''File Infection'');
AddChild(TTItem,''FileName: ''+LowerCase(APath+FSearchRec.Name));
AddChild(TTItem,''Object Description: ''+t);
TTItem.ImageIndex:=40;
end;
FindResult := FindNext(FSearchRec);
end;
FindResult := FindFirst(APath+''*.*'', faDirectory, DSearchRec);
while FindResult = 0 do
begin
if ((DSearchRec.Attr and faDirectory) = faDirectory) and not IsDirNotation(DSearchRec.Name) then
ScanTread(APath+DSearchRec.Name);
FindResult := FindNext(DSearchRec);
end;
finally
FindClose(FSearchRec);
end;
end;
end;

仓库管理软件版7楼: 我看不出你这个在哪用了多线程.

8楼: 那个是多线程类里面的搜索函数拉

9楼: 要有也是在递归中走进了死循环.

10楼: 还有,你这程序比较可爱,为什么要用两个FindFirst()啊,一个跑够了.多查一次不会觉得慢一倍吗?

11楼: 我不知道你的多线程类是怎么写的,但我觉得你做多线程也许就是个问题,可能多个线程都往一个目录里查过.算起来多做了很多无用功.

给你看一看我的递归查找.

unit Unit1;

interface

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

type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TSearchFileThread=class(TThread)
private
MyFileName: string;
procedure SearchFile(DirName: string);
procedure DeelWithFile;
procedure SearchComplete;
public
MyDirName: string;
protected
procedure Execute; override;

end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TSearchFileThread.DeelWithFile;
begin
Form1.ListBox1.Items.Insert(0, MyFileName);
end;

procedure TSearchFileThread.SearchFile(DirName: String);
Var
Found: integer;
SearchRec: TSearchRec;
begin
Found := FindFirst(DirName + ''*.*'',faAnyFile,searchrec);
while Found = 0 do
begin
if ((SearchRec.Attr and faDirectory)<>0) then //directory
begin
if(SearchRec.Name <> ''.'')and(SearchRec.Name <> ''..'') then
SearchFile(DirName + SearchRec.Name + ''\'')
end
else //file
begin
MyFileName := DirName + SearchRec.Name;
Synchronize(DeelWithFile);
end;
Found := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;

procedure TSearchFileThread.SearchComplete;
begin
ShowMessage(''搜索完毕,共找到'' + inttostr(Form1.ListBox1.Items.Count) + ''个文件'');
end;

procedure TSearchFileThread.Execute;
begin
SearchFile(MyDirName);
Synchronize(SearchComplete);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
SearchFileThread: TSearchFileThread;
begin
SearchFileThread := TSearchFileThread.Create(true);
SearchFileThread.MyDirName := ''F:\''; //必须以 ''\'' 结尾
SearchFileThread.Resume;
end;

end.

12楼: 这个线程函数真的有点可爱哦, 而且里面很多操作界面的语句啊,好像那应该让主线程去做才好吧,而具就像楼上老大说的样,为什么有两个FindFirst呢,不明白,还是你解释一下吧 如超市管理软件免费版

13楼: 嗯 我研究一下哈,对了 除了findfirst,findnext这种搜索方式,还有更好的吗?我看到有的软件搜索windows目录,里面有3万多个文件,用了不到10秒种就搜索完成了.难道用了ms的索引技术?

仓库管理软件版14楼: 请问benhacker,你的那个历程怎么无法暂停搜索呢?
我用
SearchFileThread.Terminate;
SearchFileThread.Free;
搜索表面上停止了,但是直到完全搜索万才能响应用户操作,这个是什么原因呢?我自己那个立即就可以停止的.谢谢

15楼: findfirst函数用的就是windows的API,速度已经很快的了,我用赛扬733的CPU来跑也不用5秒就可以把windows目录下的全部文件查完.你肯定是程序上有些地方写得不好,比如我上面跟你说到的那些无用功,另外break;可以跳出while递归循环.

16楼: 已经解决了 谢谢了.是continue推出吧?

17楼: 接受答案了.