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;

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我没有找到直接拦截文件操作的方法。但是,可以通过Hook技术来实现拦截文件操作。下面是一个使用Hook技术拦截文件操作的示例代码: ```delphi unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FHookHandle: HHOOK; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var pMsg: PMsg; begin if nCode < 0 then begin Result := CallNextHookEx(Form1.FHookHandle, nCode, wParam, lParam); Exit; end; pMsg := PMsg(lParam); if (pMsg^.message = WM_COPY) or (pMsg^.message = WM_PASTE) then begin // 拦截文件操作 Result := 1; end else begin Result := CallNextHookEx(Form1.FHookHandle, nCode, wParam, lParam); end; end; procedure TForm1.FormCreate(Sender: TObject); begin FHookHandle := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, HInstance, GetCurrentThreadId); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnhookWindowsHookEx(FHookHandle); end; end. ``` 上述代码中,我们使用了Windows API中的SetWindowsHookEx函数来设置Hook,然后在HookProc函数中拦截文件操作。需要注意的是,Hook技术需要在全局范围内生效,因此需要在程序启动时设置Hook,在程序退出时取消Hook。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值