文件夹以及其子目录。还有,怎么怎么才能让Delphi遍历一个判断两个文件是不是同一个文件?
怎么才能让Delphi遍历一个文件夹以及其子目录输入文件夹路径输出一个数组s:array[1..1000]ofstrings[i]为文件路径。还有,怎么判断两个文件是不是...
怎么才能让Delphi遍历一个文件夹以及其子目录 输入文件夹路径输出一个数组s:array[1..1000] of string s[i]为文件路径。还有,怎么判断两个文件是不是同一个文件?
展开
2个回答
展开全部
给你一个函数,取得整个目录下所有文件,不过返回的是一个TStrings,而不是数组,如下:
function GetFilesList(const Path:string;FilesList:TStrings;const Filter:String):Boolean;
var DR: TSearchRec;
ZR: Integer;
TmpPath:String;
begin
if RightStr(Path,1)='\' then
TmpPath:=Path
else tmpPath:=path+'\';
ZR:=FindFirst(TmpPath+ Filter, FaAnyfile, DR);
try
while ZR = 0 do
begin
if ((DR.Attr and FaDirectory <> FaDirectory)
and (DR.Attr and FaVolumeID <> FaVolumeID))
and (DR.Name <> '.') and (DR.Name <> '..') then
begin
FilesList.Add(DR.Name);
end;
ZR := FindNext(DR);
end;//end while
finally
FindClose(DR);
end;
Result:=FilesList.Count>0;
end;
用法:
var FileList:TStrings;
FileList:=TStringList.create;
try
if GetFilesList('D:\abc\',FileList,'*.*') then//取得D:\abc目录下所有文件。*.*表示所有文件,如果只要文本文件可以这样*.txt
begin
//做你的处理
end;
finally
FileList.free;
end;
判断两个文件是否相同可以计算文件的Hash进行比较,下面是一个CRC算法的文件较验函数:
function GetFileCRC(pFileName: string): string;
var
i, j, crc, rCRC, Temp: Integer;
CRCTable: array[0..255] of Integer;
f: TMemoryStream;
p: PChar;
Temp1, Temp2: byte;
strFileName: string;
begin
result := '';
for i := 0 to 255 do begin
crc := i;
for j := 0 to 7 do begin
if Boolean(crc and 1) then
crc := Cardinal(crc shr 1) xor $EDB88320
else
crc := crc shr 1;
end;
CRCTable[i] := crc;
end;
f := TMemoryStream.Create;
try
f.LoadFromFile(pFileName);
if f.Size <= 0 then begin
f.Free;
exit;
end;
p := f.Memory;
rCRC := -1;
for i := 0 to f.Size - 1 do begin
Temp2 := rCRC and $000000FF;
Temp := PByte(@p[i])^ xor Temp2;
rCRC := rCRC shr 8;
rCRC := rCRC xor CRCTable[Temp];
end;
rCRC := not rCRC;
result := Format('%x', [rCRC]);
finally
f.Free;
end;
end;
用法:
if GetFileCRC('D:\a.txt')=GetFileCRC('D:\b.txt') then
showmessage('是同一个文件')
else showmessage('不是同一个文件');
function GetFilesList(const Path:string;FilesList:TStrings;const Filter:String):Boolean;
var DR: TSearchRec;
ZR: Integer;
TmpPath:String;
begin
if RightStr(Path,1)='\' then
TmpPath:=Path
else tmpPath:=path+'\';
ZR:=FindFirst(TmpPath+ Filter, FaAnyfile, DR);
try
while ZR = 0 do
begin
if ((DR.Attr and FaDirectory <> FaDirectory)
and (DR.Attr and FaVolumeID <> FaVolumeID))
and (DR.Name <> '.') and (DR.Name <> '..') then
begin
FilesList.Add(DR.Name);
end;
ZR := FindNext(DR);
end;//end while
finally
FindClose(DR);
end;
Result:=FilesList.Count>0;
end;
用法:
var FileList:TStrings;
FileList:=TStringList.create;
try
if GetFilesList('D:\abc\',FileList,'*.*') then//取得D:\abc目录下所有文件。*.*表示所有文件,如果只要文本文件可以这样*.txt
begin
//做你的处理
end;
finally
FileList.free;
end;
判断两个文件是否相同可以计算文件的Hash进行比较,下面是一个CRC算法的文件较验函数:
function GetFileCRC(pFileName: string): string;
var
i, j, crc, rCRC, Temp: Integer;
CRCTable: array[0..255] of Integer;
f: TMemoryStream;
p: PChar;
Temp1, Temp2: byte;
strFileName: string;
begin
result := '';
for i := 0 to 255 do begin
crc := i;
for j := 0 to 7 do begin
if Boolean(crc and 1) then
crc := Cardinal(crc shr 1) xor $EDB88320
else
crc := crc shr 1;
end;
CRCTable[i] := crc;
end;
f := TMemoryStream.Create;
try
f.LoadFromFile(pFileName);
if f.Size <= 0 then begin
f.Free;
exit;
end;
p := f.Memory;
rCRC := -1;
for i := 0 to f.Size - 1 do begin
Temp2 := rCRC and $000000FF;
Temp := PByte(@p[i])^ xor Temp2;
rCRC := rCRC shr 8;
rCRC := rCRC xor CRCTable[Temp];
end;
rCRC := not rCRC;
result := Format('%x', [rCRC]);
finally
f.Free;
end;
end;
用法:
if GetFileCRC('D:\a.txt')=GetFileCRC('D:\b.txt') then
showmessage('是同一个文件')
else showmessage('不是同一个文件');
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询