Intraweb搜索某目录下的文件

用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表示找到的是文件不是目录

发表评论