一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Delphi中TSearchRec的Attr有效值問題

 天已 2012-04-14
Delphi中TSearchRec的Attr有效值問題
Delphi中的TSearchRec結構中有Attr的屬性。從幫助文檔可知Attr只提供了7中類型的文件屬性值:
-------------------------------------------------------------
Constant Value Description Linux Meaning
-------------------------------------------------------------
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.
-------------------------------------------------------------
而實際上,Windows中遠不只這幾種類型的文件。當我們通過判斷Attr值來查找制定類型的文件時如果用以上7中值查找我們會漏掉很多類型的
文件,因為很多文件類型TSearchRec.Attr都沒有提供,且即便是用faAnyFile或者用這7種類型的組合也不能找出全部的文件。通過分析發(fā)現(xiàn),
我還找到了Windows中眾多不同于以上7中Value值的文件,現(xiàn)將這些文件類型羅列如下:
-------------------------------------------------------------
1.其中文件夾(即目錄)的幾種屬性組合情況【壓縮和加密不可同時存在】
8208 NULL
8208 只讀
8210 隱藏
8240 存檔
16 索引
10256 壓縮
24624 加密
8242 只讀+隱藏
8240 只讀+存檔
16 只讀+索引
10256 只讀+壓縮
24624 只讀+加密
8242 只讀+隱藏+存檔
18 只讀+隱藏+索引
10258 只讀+隱藏+壓縮
24626 只讀+隱藏+加密
50 只讀+隱藏+存檔+索引
10290 只讀+隱藏+存檔+壓縮
24626 只讀+隱藏+存檔+加密
2098 只讀+隱藏+存檔+索引+壓縮
16434 只讀+隱藏+存檔+索引+加密
48 只讀+存檔+索引
10288 只讀+存檔+壓縮
24624 只讀+存檔+加密
2096 只讀+存檔+索引+壓縮
16432 只讀+存檔+索引+加密
2096 只讀+索引+壓縮
16432 只讀+索引+加密
8242 隱藏+存檔
18 隱藏+索引
10258 隱藏+壓縮
24626 隱藏+加密
50 隱藏+存檔+索引
10290 隱藏+存檔+壓縮
24626 隱藏+存檔+加密
2098 隱藏+索引+壓縮
16434 隱藏+索引+加密
48 存檔+索引
10288 存檔+壓縮
24624 存檔+加密
2096 存檔+索引+壓縮
16432 存檔+索引+加密
2096 索引+壓縮
16400 索引+加密
文件夾(即目錄)可能有以下類型【用對應Value值表示】
16,17,18,19,20,21,22,23,48,49,50,2064,2066,2096,2098,8208,8210,8240,8242,10256,10258,10288,10290,16400,16402,16432,16434,2462
4,24626,1243048
-------------------------------------------------------------
2.其中文件的幾種屬性組合情況【此處沒有像文件夾類型那樣一一寫成對應整數(shù)值】
只讀
隱藏
存檔
索引
壓縮
加密
只讀+隱藏
只讀+存檔
只讀+索引
只讀+壓縮
只讀+加密
只讀+隱藏+存檔
只讀+隱藏+索引
只讀+隱藏+壓縮
只讀+隱藏+加密
只讀+隱藏+存檔+索引
只讀+隱藏+存檔+壓縮
只讀+隱藏+存檔+加密
文件可能有以下類型【用對應Value值表示】
1,2,3,4,6,7,32,33,34,35,36,38,39,128,2049,2080,2083,2086,8192,8193,8195,8224,8227,10241, 12582,16416,16419, 
24577,16416,16419, 24577
后記:Windows中的文件大部分都在提供的7種類型中,但是如果我們要搜索文件是硬盤上的所有類型的文件時用提供的7種類型或其組合是無法
找出來的,我們只能通過盤讀SearchRec.Attr>0的方式找出所有文件,當我們要查找這7種文件類型以外的某種指定類型的文件時我們只能通過
制定其Value來查找。以下提供了幾個遍歷文件有關的函數(shù)或方法:
  1. unit utFileSearch;  
  2. interface  
  3. uses  
  4.   Windows, SysUtils, Classes;  
  5.   { TODO : 從搜索記錄中判斷是否是子目錄 }  
  6.   function IsValidDir(SearchRec:TSearchRec):Boolean;  
  7.   { TODO : 判斷是不是實在的文件 }  
  8.   function IsRealFile(SearchRec:TSearchRec):Boolean;  
  9.   { TODO : 返回所有的文件名及其路徑[不包括目錄文件] 
  10.   MainPath:string; 為根目錄 
  11.   var FoundResult:TStrings;為返回的文件列表結果集 
  12.   當找到的文件大于一個時返回True}  
  13.   function ListRealFile(MainPath:stringvar FoundResult:TStrings):Boolean;  
  14.   { TODO : 返回所有的文件夾名及其路徑[既目錄文件] 
  15.   MainPath:string; 為根目錄 
  16.   var FoundResult:TStrings;為返回的文件列表結果集 
  17.   當找到的文件大于一個時返回True}  
  18.   function ListValidDir(MainPath:stringvar FoundResult:TStrings):Boolean;  
  19.   { TODO : 遍歷指定文件類型的文件名及其路徑 
  20.   MainPath:string; 為根目錄 
  21.   FileExt:string; 為需要查找的文件擴展名,必須代點如‘.exe’ 
  22.   var FoundResult:TStrings;為返回的文件列表結果集 
  23.   當找到的文件大于一個時返回True}  
  24.   function ListExtFile(MainPath:string; FileExt:stringvar FoundResult:TStrings):Boolean;  
  25.   { TODO : 獲取可寫入的磁盤的列表}  
  26.   function GetDrives(var ResultList:TStrings):integer;  
  27.     
  28.   { TODO : 遍歷指定文件類型的文件名及其路徑[所有盤符下] 
  29.   FileExt:string; 為需要查找的文件擴展名,必須代點如‘.exe’ 
  30.   var FoundResult:TStrings;為返回的文件列表結果集 
  31.   當找到的文件大于一個時返回True}  
  32.   function ListAllExtFile(FileExt:stringvar FoundResult:TStrings):Boolean;  
  33. implementation  
  34. {將可寫入數(shù)據(jù)的盤羅列出來,拋棄未知,光驅,路徑不正確的}  
  35. function GetDrives(var ResultList:TStrings):integer;  
  36. var  
  37.   DriveNum: Integer;  
  38.   DriveBits: set of 0..25//假設最多有26個盤  
  39.   DriveType: UINT; //驅動器類型  
  40.   DriveName: string;  
  41. begin  
  42.   //獲取全部Drivers并格式化到DriveBits里面  
  43.   Integer(DriveBits) := GetLogicalDrives;  
  44.   for DriveNum := 0 to 25 do  
  45.   begin  
  46.   //不在表里則放棄  
  47.   if not (DriveNum in DriveBits) then Continue;  
  48.   DriveName:= Char(DriveNum + Ord('A'))+ ':';  
  49.   DriveType:= GetDriveType(PCHAR(@DriveName[1])); //獲得磁盤類型  
  50.   //清楚CDROM,未知,無效 和 network 類型的驅動器  
  51.   if (DriveType<>DRIVE_CDROM) and (DriveType<>0and  
  52.   (DriveType<>DRIVE_REMOTE) and (DriveType<>1then  
  53.   begin  
  54.   ResultList.Add(DriveName+'/');  
  55.   end;  
  56.   end;  
  57.   Result:=ResultList.Count;  
  58. end;  
  59. function IsValidDir(SearchRec:TSearchRec):Boolean;  
  60. begin  
  61.   { TODO : 文件類型為[16,31]和48,49,2064,2096的都是文件夾既目錄 }  
  62.   if ( ((SearchRec.Attr>=16)and(SearchRec.Attr<=31)) or  
  63.   (SearchRec.Attr=48or (SearchRec.Attr=49or  
  64.   (SearchRec.Attr=50or (SearchRec.Attr=2064or  
  65.   (SearchRec.Attr=2066or (SearchRec.Attr=2096or  
  66.   (SearchRec.Attr=2098or (SearchRec.Attr=8208or  
  67.   (SearchRec.Attr=8210or (SearchRec.Attr=8240or  
  68.   (SearchRec.Attr=8242or (SearchRec.Attr=10256or  
  69.   (SearchRec.Attr=10258or (SearchRec.Attr=10288or  
  70.   (SearchRec.Attr=10290or (SearchRec.Attr=16400or  
  71.   (SearchRec.Attr=16402or (SearchRec.Attr=16432or  
  72.   (SearchRec.Attr=16434or (SearchRec.Attr=24624or  
  73.   (SearchRec.Attr=24626or (SearchRec.Attr=1243048) ) and  
  74.   ( SearchRec.Name<>'.' ) and (SearchRec.Name<>'..' )  
  75.   then Result:=True else Result:=False;  
  76. end;  
  77. function IsRealFile(SearchRec:TSearchRec):Boolean;  
  78. begin  
  79.   { TODO : 文件類型為1,2,3,4,6,7,32,33,34,35,36,38,39,128,2049,2080,2083,2086, 
  80.   8192,8193,8195,8224,8227,10241, 12582,16416,16419, 24577的都是實在的文件}  
  81.   if ( ((SearchRec.Attr>=1)and(SearchRec.Attr<=15)) or //[1,15]  
  82.   ((SearchRec.Attr>=32)and(SearchRec.Attr<40)) or //[32,40)  
  83.   (SearchRec.Attr=128or (SearchRec.Attr=2049or  
  84.   (SearchRec.Attr=2080)or (SearchRec.Attr=2083or  
  85.   (SearchRec.Attr=2086)or (SearchRec.Attr=8192or  
  86.   (SearchRec.Attr=8193)or (SearchRec.Attr=8195or  
  87.   (SearchRec.Attr=8224)or (SearchRec.Attr=8227or  
  88.   (SearchRec.Attr=10241)or (SearchRec.Attr=12582or  
  89.   (SearchRec.Attr=16416)or (SearchRec.Attr=16419or  
  90.   (SearchRec.Attr=24577) ) and  
  91.   (SearchRec.Name<>'.'and (SearchRec.Name<>'..')  
  92.   then Result:=True else Result:=False;  
  93. end;  
  94. function ListRealFile(MainPath:stringvar FoundResult:TStrings):Boolean;  
  95. var SearchRec:TSearchRec;  
  96.   Dir:TStrings; //用TStrings記錄找到的文件的路徑  
  97.   i:Integer;  
  98. begin  
  99.   MainPath:=Trim(MainPath);  
  100.   if MainPath='' then  
  101.   begin  
  102.   Result:=False;  
  103.   Exit;  
  104.   end;  
  105.   Dir:=TStringList.Create;  
  106.   FindFirst(MainPath+'*.*',faAnyFile, SearchRec);  
  107.   //將子目錄放入Dir中  
  108.   if IsValidDir(SearchRec) then Dir.Add(SearchRec.Name);  
  109.   //將文件放入結果集中  
  110.   if IsRealFile(SearchRec) then FoundResult.Add(MainPath+SearchRec.Name);  
  111.   //找完第一條后繼續(xù)尋找  
  112.   Repeat  
  113.   i:=FindNext(SearchRec);  
  114.   if i=0 then  
  115.   begin  
  116.   if IsValidDir(SearchRec) then Dir.Add(SearchRec.Name);  
  117.   if IsRealFile(SearchRec) then FoundResult.Add(MainPath+SearchRec.Name);  
  118.   end;  
  119.   Until i<>0;  
  120.   //釋放由FindFirst開啟的資源  
  121.   FindClose(SearchRec);  
  122.   //這是遞歸部分,查找各子目錄。  
  123.   for i:=0 to Dir.Count-1 do  
  124.   ListRealFile(MainPath+Dir.Strings[i]+'/',FoundResult);  
  125.   //資源釋放  
  126.   Dir.Free;  
  127.   if FoundResult.Count>0 then Result:=True else Result:=False;  
  128. end;  
  129. function ListValidDir(MainPath:stringvar FoundResult:TStrings):Boolean;  
  130. var SearchRec:TSearchRec;  
  131.   Dir:TStrings; //用TStrings記錄找到的文件的路徑  
  132.   i:Integer;  
  133. begin  
  134.   MainPath:=Trim(MainPath);  
  135.   if MainPath='' then  
  136.   begin  
  137.   Result:=False;  
  138.   Exit;  
  139.   end;  
  140.   Dir:=TStringList.Create;  
  141.   FindFirst(MainPath+'*.*',faAnyFile, SearchRec);  
  142.   //將遞歸時還要用的子目錄放入Dir中  
  143.   if IsValidDir(SearchRec) then  
  144.   begin  
  145.   Dir.Add(SearchRec.Name);  
  146.   //收集結果集  
  147.   FoundResult.Add(MainPath+SearchRec.Name);  
  148.   end;  
  149.   //找完第一條后繼續(xù)尋找  
  150.   Repeat  
  151.   i:=FindNext(SearchRec);  
  152.   if (i=0and IsValidDir(SearchRec) then  
  153.   begin  
  154.   Dir.Add(SearchRec.Name);  
  155.   FoundResult.Add(MainPath+SearchRec.Name);  
  156.   end;  
  157.   Until i<>0;  
  158.   //釋放由FindFirst開啟的資源  
  159.   FindClose(SearchRec);  
  160.   //這是遞歸部分,查找各子目錄。  
  161.   for i:=0 to Dir.Count-1 do  
  162.   ListValidDir(MainPath+Dir.Strings[i]+'/',FoundResult);  
  163.   //資源釋放  
  164.   Dir.Free;  
  165.   if FoundResult.Count>0 then Result:=True else Result:=False;  
  166. end;  
  167. function ListExtFile(MainPath:string; FileExt:stringvar FoundResult:TStrings):Boolean;  
  168. var SearchRec:TSearchRec;  
  169.   Dir:TStrings; //用TStrings記錄找到的文件的路徑  
  170.   i:Integer;  
  171. begin  
  172.   MainPath:=Trim(MainPath);  
  173.   FileExt:=Trim(FileExt);  
  174.   //檢查輸入合法性  
  175.   if (MainPath=''or (FileExt=''then  
  176.   begin  
  177.   Result:=False;  
  178.   Exit;  
  179.   end;  
  180.   Dir:=TStringList.Create;  
  181.   FindFirst(MainPath+'*.*',faAnyFile, SearchRec);  
  182.   //將子目錄放入Dir中  
  183.   if IsValidDir(SearchRec) then Dir.Add(SearchRec.Name);  
  184.   //將文件放入結果集中  
  185.   if IsRealFile(SearchRec) then  
  186.   if ExtractFileExt(SearchRec.Name)=FileExt then  
  187.   FoundResult.Add(MainPath+SearchRec.Name);  
  188.   //找完第一條后繼續(xù)尋找  
  189.   Repeat  
  190.   i:=FindNext(SearchRec);  
  191.   if i=0 then  
  192.   begin  
  193.   if IsValidDir(SearchRec) then Dir.Add(SearchRec.Name);  
  194.   if IsRealFile(SearchRec) then  
  195.   if ExtractFileExt(SearchRec.Name)=FileExt then  
  196.   FoundResult.Add(MainPath+SearchRec.Name);  
  197.   end;  
  198.   Until i<>0;  
  199.   //釋放由FindFirst開啟的資源  
  200.   FindClose(SearchRec);  
  201.   //這是遞歸部分,查找各子目錄。  
  202.   for i:=0 to Dir.Count-1 do  
  203.   ListExtFile(MainPath+Dir.Strings[i]+'/',FileExt,FoundResult);  
  204.   //資源釋放  
  205.   Dir.Free;  
  206.   if FoundResult.Count>0 then Result:=True else Result:=False;  
  207. end;  
  208. function ListAllExtFile(FileExt:stringvar FoundResult:TStrings):Boolean;  
  209. var SearchRec:TSearchRec;  
  210.   Dir,MainDir:TStrings;  
  211.   i,j:Integer;  
  212.   function GetDrives(var ResultList:TStrings):integer;  
  213.   var  
  214.   DriveNum: Integer;  
  215.   DriveBits: set of 0..25;  
  216.   DriveType: UINT;  
  217.   DriveName: string;  
  218.   begin  
  219.   Integer(DriveBits) := GetLogicalDrives;  
  220.   for DriveNum := 0 to 25 do  
  221.   begin  
  222.   if not (DriveNum in DriveBits) then Continue;  
  223.   DriveName:= Char(DriveNum + Ord('A'))+ ':';  
  224.   DriveType:= GetDriveType(PCHAR(@DriveName[1]));  
  225.   if (DriveType<>DRIVE_CDROM) and (DriveType<>0and  
  226.   (DriveType<>DRIVE_REMOTE) and (DriveType<>1then  
  227.   begin  
  228.   ResultList.Add(DriveName+'/');  
  229.   end;  
  230.   end;  
  231.   Result:=ResultList.Count;  
  232.   end;  
  233. begin  
  234.   FileExt:=Trim(FileExt);  
  235.   if FileExt='' then  
  236.   begin  
  237.   Result:=False;  
  238.   Exit;  
  239.   end;  
  240.   MainDir:=TStringList.Create;  
  241.   if GetDrives(MainDir)>0 then  
  242.   begin  
  243.   for j:=0 to MainDir.Count-1 do  
  244.   begin  
  245.   Dir:=TStringList.Create;  
  246.   FindFirst(MainDir.Strings[j]+'*.*',faAnyFile, SearchRec);  
  247.   if IsValidDir(SearchRec) then Dir.Add(SearchRec.Name);  
  248.   if IsRealFile(SearchRec) then  
  249.   if ExtractFileExt(SearchRec.Name)=FileExt then  
  250.   FoundResult.Add(MainDir.Strings[j]+SearchRec.Name);  
  251.   Repeat  
  252.   i:=FindNext(SearchRec);  
  253.   if i=0 then  
  254.   begin  
  255.   if IsValidDir(SearchRec) then Dir.Add(SearchRec.Name);  
  256.   if IsRealFile(SearchRec) then  
  257.   if ExtractFileExt(SearchRec.Name)=FileExt then  
  258.   FoundResult.Add(MainDir.Strings[j]+SearchRec.Name);  
  259.   end;  
  260.   Until i<>0;  
  261.   FindClose(SearchRec);  
  262.   for i:=0 to Dir.Count-1 do  
  263.   ListExtFile(MainDir.Strings[j]+Dir.Strings[i]+'/',FileExt,FoundResult);  
  264.   Dir.Free;  
  265.   end;  
  266.   if FoundResult.Count>0 then Result:=True else Result:=False;  
  267.   end  
  268.   else  
  269.   Result:=False;  
  270.   MainDir.Free;  
  271. end;  
  272. end.  

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产超薄黑色肉色丝袜| 国产午夜精品美女露脸视频| 国产亚洲欧美另类久久久| 午夜精品黄片在线播放| 空之色水之色在线播放| 国产级别精品一区二区视频| 年轻女房东2中文字幕| 欧美在线视频一区观看| 微拍一区二区三区福利| 精品国产av一区二区三区不卡蜜| 日本加勒比不卡二三四区| 午夜精品福利视频观看| 好吊妞视频只有这里有精品| 日本一品道在线免费观看| 99精品国产自在现线观看| 亚洲深夜精品福利一区| 国产麻豆一线二线三线| 国产又粗又长又大的视频| 午夜福利国产精品不卡| 免费观看一级欧美大片| 久久99国产精品果冻传媒| 欧美国产亚洲一区二区三区| 日韩视频在线观看成人| 国产精品午夜小视频观看| 欧美日韩综合免费视频| 成人精品一区二区三区综合| 国产欧美日韩在线一区二区| 亚洲伦片免费偷拍一区| 亚洲欧美日本视频一区二区| 国产女性精品一区二区三区| 99久久精品午夜一区| av免费视屏在线观看| 日本二区三区在线播放| 午夜福利激情性生活免费视频| 国产日韩在线一二三区| 亚洲妇女作爱一区二区三区| 欧美黑人暴力猛交精品| 日本二区三区在线播放| 手机在线观看亚洲中文字幕| 99秋霞在线观看视频| 亚洲一区二区三区免费的视频|