delphi对文件的操作

Delphi获取某个路径下的所有子文件名并存于数组中:

//
//获取路径下文件夹的子文件名
//@path:文件夹路径
//@Filename:用于存获取到的文件名的字符串数组
//返回值:子文件的数量
function getChildFilesName(path:string;out Filename:array of string):Integer;
var
Files: TStringDynArray;
i:Integer;
str:string;
begin
  Files := TDirectory.GetFiles(path,'*.*', TSearchOption.soTopDirectoryOnly); //获取文件名集合,参数为路径、文件格式、搜索选项,这个Getfiles方法还有别的重载。
  i:=0;
  for str in Files do
  begin
    FileName[i]:=str;    //将文件名保存进字符串数组
    i:=i+1;
  end;
  Result:=i;//返回数组的成员个数
end;

TStringDynArray类型的Files数组貌似不能进行操作,Files可以通过序号索引将文件名取出。没有深入研究,赶需求用的一个字符串数组把Files里的内容取出来。

delphi对文件的创建以及写入(.txt,.dat文件等):

//创建并写入一个文件中(这里用的.dat文件)
//@t:对应Liquideadd的time属性
//@num:对应Liquideadd的num属性
//@mode:对应Liquideadd的mode属性
//@LiquideName:string:对应Liquideadd的modeLiquideName:string
//@value:对应Liquideadd的value属性
//procedure delphi中的过程,就是void类型方法,无返回值
procedure LiquideAddRecorde(t:string;num:string;mode:string;LiquideName:string;value:Double);
var
fn: string;
F: TFileStream;
liquideAdd:TLiquideAdd;
begin
  try
    liquideAdd.time:=t;
    liquideAdd.num:=num;
    liquideAdd.mode:=mode;
    liquideAdd.name:=LiquideName;
    liquideAdd.value:=value;    
     //这里的Liquideadd是一个record类型的数据(好像就是结构体)
     //里面的属性不赘述
    try
      fn :=
        IncludeTrailingPathDelimiter (ExtractFileDir (Application.ExeName)) +
        'ResData\EnglishLiquidRecorde\'+FormatDateTime('yyyy年MM月dd日',Now)+'LiquidRecorde.dat';//定义创建文件的文件名
      if FileExists(fn) then
      begin
        F := TFileStream.Create (fn, fmOpenReadWrite);
        //文件存在就打开文件并给可以读写的权限
      end
      else
      begin
        ForceDirectories (
          IncludeTrailingPathDelimiter (ExtractFileDir (Application.ExeName)) +
          'ResData\LiquidRecorde\');//锁定要创建文件的路径
        F := TFileStream.Create (fn, fmCreate or fmOpenWrite);
        //文件不存在,创建、打开并给文件可以读写的权限
      end;
      try
        F.Seek (0, soFromEnd);//在文末进行写入
        //seek的第一个参数是偏移量,第二个是写入的开头
        F.Write (liquideAdd, SizeOf (TLiquideAdd));
        //写入
      finally
        F.Free;//释放资源
      end;
    except
    end;
  except
  end;
end;

对写入的文件进行读取:

//读取刚刚写入的文件
//@filename:读取文件的文件名
//@num:筛选的序号
//无返回值
procedure TLiquidAddRecordeFrm.ReadLiquideAddRecorde(fileName:string;num:string);
var
liquideAdd:TLiquideAdd;
ms: TMemoryStream;
newMemoSring:string;//防止重复显示的缓存
begin
  newMemoSring:='';

  ms := TMemoryStream.Create;//打开流
    ms.LoadFromFile(fileName);//打开文件
    ms.Position := 0;//定位到文件开头
    Memo1.Clear;//Memo1是要将结果显示的控件
    while ms.Position < ms.Size do  //没有到文件末尾,就一直读
    begin
      ms.Read(liquideAdd, SizeOf(liquideAdd));
      //根据一个record的长度来读取文件
      if(liquideAdd.num=num) then //只显示筛选到的结果,根据num筛选
      begin
        if(ms.Position<>0)then  //不是开头,就先把这次的信息存到缓存中
        begin
          newMemoSring:=liquideAdd.time+' use '+liquideAdd.mode+ ' mode add'+liquideAdd.name+' ,values:  '+floattostr(liquideAdd.value)+'ml。';
          if(newMemoSring<>memoString1)then
          //memoString1是全局的缓存,存上次的记录
          //这次的缓存若和上次存的一样,则会重复显示,就要避免这样
          begin
            Memo1.Lines.Add(newMemoSring);//显示
            memoString1:=newMemoSring;//存上次的缓存
          end;
        end
        else//文件开头时,直接显示
        begin
          Memo1.Lines.Add(liquideAdd.time+' use '+liquideAdd.mode+ ' mode add '+liquideAdd.name+' ,values: '+floattostr(liquideAdd.value)+'ml。');
          memoString1:= liquideAdd.time+' use '+liquideAdd.mode+ ' mode add '+liquideAdd.name+' ,values: '+floattostr(liquideAdd.value)+'ml。';//缓存
        end;
      end;
    end;
    memoString1 :='';//清空这次的缓存
    ms.Free;
end;

读取文件时做了个防止显示重复数据的操作,很多余。。。因为写入文件的时候造成了非人为的重复读,让写入时的数据就有问题了。

猜你喜欢

转载自blog.csdn.net/qq_16039013/article/details/80736226