unit MyFileMeneger; interface uses Windows,classes,sysutils; function Slash(const Path: string ): String; //路径的末尾如果没有反斜杠,则加上反斜杠。slash:英文指反斜杠 function GetDiskList():tstringlist ; //读取驱动器列表 //读取目录下的文件列表(包括文件夹) function ReadFiles(const ParentDir:string;mask:string='*.*'; Attr:word=63):tstringList ; stdcall; //读取目录下的所有文件列表,包括子目录下的文件(但返回值中不包括文件夹) function ReadAllFiles(const ParentDir:string; mask:string='*.*'; Attr:word=63):tstringList ; stdcall; //mask= '*.*' 表示所有文件, //Attr:word=63表示各种属性的文件或文件夹, //16表示文件夹,32表示文件 //若此文件或文件夹 有只读属性则+1,有隐藏属性+2,有系统属性再+4 //例如:33表示具有只读属性的文件; 19=16+1+2表示具有只读和隐藏属性的文件夹 //例如: 2则表示具有隐藏属性的文件夹 或文件. function GetSize(PathNameOrDir : string):int64; //文件或文件夹大小 function GetFileSize(PathName : string):int64; //文件大小 function GetAllFileSize(Path : string):int64; //文件夹大小 function FormatFileSize(fileSize : integer ):string; //转换类型:格式化文件大小的输出格式。 implementation function GetDiskList():tstringlist; //读取驱动器列表 var Drive :Char; DriveType :integer; begin result:=tstringlist.Create; for Drive := 'A' to 'Z' do begin Drivetype:= GetDriveType( pansichar(Drive + ':/') ) ; {case drivetype of //如果不存在则返回0 Drive_Removable: //软盘,可移动U盘 =2 Drive_Fixed: //硬盘 =3 Drive_ReMote: //网络 =4 Drive_CDRom: //光盘 =5 Drive_RamDisk: //虚拟 =6 } if (drivetype>=2)and(drivetype<=6) then result.Append( Drive + ':=' + inttostr(DriveType) ); //形式为 C:=3 end; end; function Slash(const Path: String): String; //路径的末尾如果没有反斜杠,则加上反斜杠。slash:英文指反斜杠 begin // ^ if AnsiLastChar(Path)<> '/' then Result := Path + '/'// + S else Result := Path ;//+ S; end; function GetSubsCount(const ParentDir,mask:string; Attr:integer; var FileList:tstringList):integer; stdcall; var //不用了 PathMask :string; FileInfo :Tsearchrec; begin //ChDir(ParentDir); pathmask :=Slash(parentdir)+mask; result:=0; if FindFirst(pathmask , Attr , FileInfo) = 0 then//Find找到文件则返回0,否则返回一个错误号. begin //faanyfile aReadOnly + faHidden // ftNormal //result:=true; repeat if (fileinfo.Name<>'.')and(fileinfo.Name<>'..') then begin filelist.Append(fileinfo.Name); result := Result + 1 ; end; until FindNext(FileInfo) <> 0; FindClose(FileInfo); end; end; //读取目录下的文件列表(包括文件夹) function ReadFiles(const ParentDir:string;mask:string='*.*'; Attr:word=63):tstringList ; stdcall; //mask= '*.*' 表示所有文件, //Attr:word=63表示各种属性的文件或文件夹, //16表示文件夹,32表示文件 //若此文件或文件夹 有只读属性则+1,有隐藏属性+2,有系统属性再+4 //例如:33表示具有只读属性的文件; 19=16+1+2表示具有只读和隐藏属性的文件夹 //例如: 2则表示具有隐藏属性的文件夹 或文件. var PathMask :string; FileInfo :Tsearchrec; begin pathmask :=Slash(parentdir)+mask; result:=tstringlist.Create; try if FindFirst(pathmask , FaAnyFile , FileInfo) = 0 then//Find找到文件则返回0,否则返回一个错误号. begin // aReadOnly + faHidden // ftNormal repeat if not((fileinfo.Name='.')or(fileinfo.Name='..')) then //不考虑文件夹"."和".." begin if (fileinfo.Attr and attr)<>0 then //这行很重要,用于检查当前文件的属性是否符合参数要求 begin result.Append(fileinfo.Name);///+'='+inttostr(fileinfo.Attr) ); end; end; until FindNext(FileInfo) <> 0; end; finally if result.Count=0 then result:=nil; FindClose(FileInfo); end; end; //读取目录下的文件列表,包括子目录下的文件(返回值中不包括文件夹,返回值是相对路径(从PARENTDIR开始的) function ReadAllFiles(const ParentDir:string; mask:string='*.*'; Attr:word=63):tstringList ; stdcall; //mask= '*.*' 表示所有文件, //Attr:word=63表示各种属性的文件或文件夹, //16表示文件夹,32表示文件 //若此文件或文件夹 有只读属性则+1,有隐藏属性+2,有系统属性再+4 //例如:33表示具有只读属性的文件; 19=16+1+2表示具有只读和隐藏属性的文件夹 //例如: 2则表示具有隐藏属性的文件夹 或文件. var i,j : integer; files,SubFiles :tstringlist; begin result:=tstringlist.Create; //读取文件 files := readfiles(parentdir,mask,32); //读取所有文件 if files<>nil then for i:=0 to files.Count-1 do if (filegetattr( Slash(parentdir)+files[i] )and attr)<>0 then result.Append(files[i]); //处理文件夹 files.Free; files := readfiles(parentdir,'*.*',16); //取得所有文件夹 if files <> nil then for i:=0 to files.Count-1 do Begin subfiles := readallfiles(Slash(parentdir)+files[i],mask,attr) ; //递归调用自身 if subfiles<>nil then for j:= 0 to subfiles.Count-1 do result.Append( Slash( files[i] ) + subfiles[j] ); end; files.Free; subfiles.Free; if result.Count=0 then result:=nil; end; //文件大小 function GetFileSize(PathName : string):int64; var //若PathName指定的是文件,则返回以字节为单位的文件大小, f : tsearchRec; //若PathName指定的是文件夹,则返回0 . begin result:=0; try if findfirst(pathname,faAnyFile,f )=0 then result:=f.Size; finally findclose(f); end; end; //文件夹大小 function GetAllFileSize(Path : string):int64; var i,j : integer; files,SubFiles :tstringlist; begin result:=0; files := readfiles(path,'*.*',faanyfile); if files <> nil then begin for i:=0 to files.Count-1 do Begin if (filegetattr( Slash(path)+files[i] )and fadirectory)<>0 then begin //文件夹 result := result + getallfilesize( Slash(path)+files[i] ) ; end else begin result:=result+getfilesize( Slash(path)+files[i] ); end; End; end; files.Free; //subfiles.Free; end; //文件或文件夹大小 function GetSize(PathNameOrDir : string):int64; var i : integer; files :tstringlist; f:tsearchrec; begin result:=0; if (filegetattr(pathnameordir) and fadirectory)<>0 then begin //文件夹 files := readfiles(pathnameordir,'*.*',faanyfile); if files<>nil then for i:=0 to files.Count-1 do result:=result+getsize( Slash(PathNameOrDir)+files[i]) ; end else begin try if findfirst(PathNameOrDir,faAnyFile,f )=0 then result:=f.Size; finally findclose(f); end; end; end; //转换类型 function FormatFileSize(fileSize : integer ):string; var size : single; begin size := filesize;// getfilesize(pathname); result:=formatfloat('0B' ,size); //0 强制显示,#可以不显示. if size>=1024 then begin size:=size / 1024.00; if size<10 then result:=formatfloat('0.00KB' ,size) else if size<100 then result:=formatfloat('0.0KB' ,size) else result:=formatfloat('0.KB' ,size); end; if size>=1024 then begin size:=size / 1024.00; if size<10 then result:=formatfloat('0.00MB' ,size) else if size<100 then result:=formatfloat('0.0MB' ,size) else result:=formatfloat('0.MB' ,size); end; if size>=1024 then begin size:=size / 1024.00; if size<10 then result:=formatfloat('0.00GB' ,size) else if size<100 then result:=formatfloat('0.0GB' ,size) else result:=formatfloat('0.GB' ,size); end; end; end.