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