1 //////////////////////根据文件后缀名返回文件类型信息
2
3 function TfrmMain.GetFileInfoByExt(ExtName:string):SHFILEINFO;
4 var
5 sinfo: SHFILEINFO;
6 sFlag: Integer;
7 begin
8 if copy(Extname,1,1)<>'.' then ExtName:='.'; //必须有".",比如 .doc, .xls, .PDF
9 ZeroMemory(@sinfo, sizeof(sinfo));
10 sflag:=( SHGFI_USEFILEATTRIBUTES or SHGFI_SMALLICON or SHGFI_ICON or SHGFI_TYPENAME);
11 SHGetFileInfo(PAnsiChar(ExtName), FILE_ATTRIBUTE_NORMAL,sinfo,sizeof(sinfo), sflag);
12 Result := sinfo; //返回文件信息
13 end;
14
15 //返回值: SHFILEINFO 结构
16
17 SHFILEINFOA = record
18 hIcon: HICON; { 图标句柄 }
19 iIcon: Integer; { 图标索引 }
20 dwAttributes: DWORD; { 文件属性 }
21 szDisplayName: array [0..MAX_PATH-1] of AnsiChar; { 文件显示名或路径}
22 szTypeName: array [0..79] of AnsiChar; { 类型描述 }
23
24 //////////////递归遍历文件目录,得到文件及目录信息////////
25
26 procedure TfrmMain.SearchFile(FilePath,FileName:string);
27 var
28 FSearchRec: TSearchRec;
29 FindResult: integer;
30 tempStr : String;
31 PathName : TFileName;
32
33 function IsDirNotation(ADirName: String): Boolean;
34 begin
35 Result := (ADirName = '.') or (ADirName = '..');
36 end;
37 begin
38 tempStr := FilePath+'\*.*'; // 获取有效路径
39 FindResult := FindFirst(tempStr,faAnyFile + faHidden +faSysFile + faReadOnly + faDirectory,FSearchRec);
40 try
41 while FindResult = 0 do
42 begin
43 Application.ProcessMessages;
44 if (FSearchRec.Attr and faDirectory)<>0 then
45 begin
46 if not IsDirNotation(FSearchRec.Name) then
47 begin
48 // 递归调用,查找子目录
49 tempStr := FilePath+'\'+FSearchRec.Name;
50 SearchFile(tempStr,FileName);
51 if Pos(FileName,FSearchRec.Name) <> 0 then
52 begin
53 CalcLvFile(FSearchRec,tempStr);//显示文件夹
54 Inc(DirCount);
55 end;
56 end;
57 end
58 else
59 begin
60 if pos(FileName,FSearchRec.Name) <> 0 then //匹配文件名,在lsitview显示
61 begin
62 //FilePath := FilePath +'\'+ FSearchRec.Name;
63 CalcLvFile(FSearchRec,FilePath); //显示文件信息
64 Inc(FileCount);
65 end;
66 end;
67 FindResult := FindNext(FSearchRec);
68 end;
69 finally
70 FindClose(FSearchRec);
71 end;
72 end;
73
74 ///FINDFIRST ,FINDNEXT 返回 TsearchRec 结构
75
76