您的位置:首页 > 编程语言 > Delphi

Delphi中文件操作

2012-10-28 20:26 295 查看
Delphi中磁盘文件主要分为文本文件、有类型文件和无类型文件,对文件的读写操作,Delphi已经封装了许多函数这里不再讨论,下面主要是研究一下文件搜索所用到的几个函数,也算是对近来文件学习的一个总结。

(1)FindFirst:寻找第一个特定路径中符合文件属性的对象实例,如果查找成功则返回0,否则返回错误代码。声明如下:

function FindFirst(const Path:string;Attr:Integer;var F:TSearchRec):integer;

path为给定的路径,可以包含过滤值.Attr为文件属性,详细取值可以看Delphi帮助,查找结果放在F中,F为TSearchRec类型,可以看Delphi源码SysUtils单元。

(2)FindNext:返回下一个符合条件的文件对象,其查找规则同上一次调用FindFirst。声明如下:

function FindNext(var F:TSearchRec):integer;

(3)FindClose:必须与FindFirst配套使用,释放内存变量。声明如下:

procedure FindClose(var F:TSearchRec);

了解了这几个函数用法,下面用例子加以说明,以加深理解。Delphi中删除目录的函数RmDir只能删除空目录,如果是要删除有文件和子目录的目录,该如何删除呢?

分析:对非空目录,首先查找该目录下所有文件,删除这些文件,然后查找该目录的所有子目录,遍历子目录递归删除子目录下的文件和子目录,最后删除根目录。流程如下.



打开Delphi,选择"File"-"New"-"other",新建一个Console Application,源码如下:

program RemoveFolder;

{$APPTYPE CONSOLE}

uses

SysUtils,

classes;

function BackSlash(FileSpec:string):string; //加斜杠

begin

if(FileSpec[length(FileSpec)]<>'\') then

result:=FileSpec+'\'

else

result:=FileSpec;

end;

function NoBackSlash(FileSpec:string):string;//去斜杠

begin

if(FileSpec[length(FileSpec)]='\') then

result:=copy(FileSpec,1,length(FileSpec)-1)

else

result:=FileSpec;

end;

procedure GetFileList(FileSpec:string;var FileList:TStringlist); //获取文件

var

sr:TSearchRec;

FindResult:integer;

begin

FindResult:=FindFirst(FileSpec+'*.*',faAnyFile-faDirectory,sr);

while FindResult=0 do

begin

FileList.Add(ExtractFilePath(FileSpec)+sr.Name);

FindResult:=FindNext(sr);

end;

FindClose(sr);

end;

procedure GetSubDir(Pdir:string;SubDir:TStringlist); //获取子目录

var

sr:TSearchRec;

FindResult:integer;

begin

Findresult:=FindFirst(Pdir+'*.*',faDirectory,sr);

while FindResult=0 do

begin

if pos('.',sr.Name)<>1 then //排除.和..2个虚拟目录

begin

if sr.Attr=faDirectory then

begin

SubDir.Add(Pdir+sr.Name);

end;

end;

FindResult:=FindNext(sr);

end;

FindClose(sr);

end;

function RemoveDir(path:string):Boolean; //删除目录

var

filelst,subdir:Tstringlist;

i:integer;

begin

result:=false;

if not DirectoryExists(NoBackSlash(path)) then

begin

writeln(Format('%s目录不存在',[path]));

exit;

end

else

begin

filelst:=TStringlist.Create;

GetFilelist(BackSlash(path),filelst);

for i:=filelst.Count-1 downto 0 do

begin

if not DeleteFile(filelst.Strings[i]) then

writeln(Format('%s文件无法删除',[filelst[i]]))

else

writeln(Format('正在删除%s文件',[filelst[i]]));

end;

filelst.Free;

subdir:=TStringlist.Create;

GetSubDir(BackSlash(path),subdir);

for i :=subdir.Count-1 downto 0 do

begin

RemoveDir(subdir[i]);

end;

RmDir(path);

writeln(Format('正在删除%s目录',[path]));

result:=True;

end;

end;

var

strdir:string;

begin

writeln('请输入要删除的目录');

readln(strdir);

RemoveDir(strdir);

readln;

end.

先在F:建立如下目录结构



程序运行后效果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: