Delphi中文件操作

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:建立如下目录结构

 

程序运行后效果如图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值