用Intraweb开发文件管理的云平台,其中一个关键的功能是搜索某个目录下的全部文件,并把它们排列显示给用户。下面是实例代码,布署在 windows server 2006上发挥正常。
页面创建时的代码
procedure TfmwlkShare.IWAppFormCreate(Sender: TObject);
begin
inherited;
regTop.Visible:=false;
regTop2.Visible:=false;
lblModule.Caption:='共享文件';
olbMenu.ActivePanel:=olbMenu.Panels.Count-3;
sBaseShare:=IWServerController.ContentPath+'ShareFiles\';
sBaseRecy:=IWServerController.ContentPath+'RecyFiles\';
sBaseSecu:=IWServerController.sys_AppPath+'AttaFile\SecFiles\'+UserSession.sys_UsID+'\';
hblMenu.HTMLText:='<IMG src="lkMenu.png" />';
hblFind.HTMLText:='<IMG src="lkFind.png" />';
//权限显示
hblMenu.Enabled:=UserSession.qUser.FieldByName('ShareUp').asBoolean;
advGrid.Columns[4].Visible:=UserSession.qUser.FieldByName('ShareUp').asBoolean;
advGrid.Columns[7].Visible:=UserSession.qUser.FieldByName('ShareDel').asBoolean;
lblType.Caption:='1';
SearchFile(sBaseShare);
advGrid.SortSettings.Column:=8;
advGrid.QSort;
//advGrid.AsyncUpdateAllCells;//此处可无
//上传同名文件是否覆盖的选项
bOverFile:=True;
Qry5.Close;
Qry5.SQL.Text:='select top 1 opValue from msOption where opType=''UploadOver'' ';
Qry5.Open;
if (Qry5.RecordCount =1) and (Copy(Qry5.FieldByName('opValue').AsString,1,1) <> '0') then
bOverFile:=False;
end;
寻找当前目录的下层文件并绘制表格
procedure TfmwlkShare.SearchFile(sFolder:String);
var
xDir:String;
xSearch:TSearchRec;
iI:Integer;
begin
advGrid.ClearCells;
iI:=0;
xDir:=IncludeTrailingPathDelimiter(sFolder);
if DirectoryExists(xDir) then
begin
if FindFirst(xDir+'*.*',faAnyFile,xSearch) = 0 then
begin
repeat
if(xSearch.Name <> '.') and (xSearch.Name <> '..') then
begin
iI:=iI+1;
advGrid.TotalRows:=iI;
advGrid.AsyncSetCell(1,iI-1,xSearch.Name);
if (xSearch.Attr=faDirectory) then
begin
advGrid.AsyncSetCell(2,iI-1,'');
advGrid.AsyncSetCell(3,iI-1,'');
advGrid.AsyncSetCell(8,iI-1,'D.'+copy(xSearch.Name,1,3));
end else
begin
advGrid.AsyncSetCell(2,iI-1,FormatDatetime('YYYY-MM-DD',TFile.GetLastWriteTime(xDir+xSearch.Name)));
advGrid.AsyncSetCell(3,iI-1,SizeToStr(xSearch.Size));
advGrid.AsyncSetCell(8,iI-1,'F.'+copy(xSearch.Name,1,3));
end;
end;
until FindNext(xSearch) <> 0;
FindClose(xSearch);
end;
end;
end;
搜索文件并显示搜索结果
procedure TfmwlkShare.myFindFile(sFolder,sFile:String);
var
iRow:Integer;
procedure FindSubFile(const subFolder:TFileName);
var
xSearch:TSearchRec;
begin
//目录里找文件
if FindFirst(subFolder + sFile,faAnyFile,xSearch) = 0 then
begin
try
repeat
//找到的是文件
if ((xSearch.Attr and faDirectory) =0) and
(xSearch.Name <> '.') and (xSearch.Name <> '..')then
begin
iRow:=iRow+1;
advGrid.TotalRows:=iRow;
advGrid.AsyncSetCell(1,iRow-1,StringReplace(subFolder,sFolder,'',[]) + xSearch.Name);
advGrid.AsyncSetCell(2,iRow-1,FormatDatetime('YYYY-MM-DD',TFile.GetLastWriteTime(xSearch.Name)));
advGrid.AsyncSetCell(3,iRow-1,SizeToStr(xSearch.Size));
advGrid.AsyncSetCell(8,iRow-1,'F.'+copy(xSearch.Name,1,3));
end;
until FindNext(xSearch) <> 0;
FindClose(xSearch);
except
FindClose(xSearch);
raise;
end;
end;
//目录里找子目录
if FindFirst(subFolder + '*',faDirectory,xSearch)=0 then
begin
try
repeat
if ((xSearch.Attr and faDirectory)<>0) and
(xSearch.Name <> '.')and(xSearch.Name<>'..') then
FindSubFile(subFolder + xSearch.Name+'\');
until FindNext(xSearch) <> 0;
except
FindClose(xSearch);
raise;
end;
FindClose(xSearch);
end;
end;
begin
try
iRow:=0;
FindSubFile(sFolder); //在指定或返回的路径中查找
except
raise;
end;
end;
函数 FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
其中FileAttrs的值如下
faAnyFile 0 所有文件和子目录
faReadOnly 1 Read-only files Current user does not have write access.
faHidden 2 Hidden files File name begins with “.”.
faSysFile 4 System files File is socket, symbolic link, device file, or FIFO.
faVolumeID 8 Volume ID files Not used.
faDirectory 16 Directory files Directory.
faArchive 32 Archive files Not used.
faSymLink 64 Symbolic link File is a symbolic link.
faAnyFile 71 Any file Any file.
属性判断方法:(SearchRec.Attr and faHidden) <> 0 表示是隐藏文件
(xSearchRec.Attr and faDirectory) =0表示找到的是文件不是目录
