ChangeFileExt函数提供的功能是替换文件扩展名,比如说有文件 C:\Intel\Logs\IntelChipset.log,则:
ChangeFileExt('C:\Intel\Logs\IntelChipset.log', '');
返回值为:C:\Intel\Logs\IntelChipset
但有一种特殊文件,例如:C:\Pic\.png,可以理解为文件名为空,扩展名为'.png',(资源管理器直接改不允许出现这种文件名,但事实上存在,也可以建立。活生生的例子:大家如果安装的是完全版的XE2,可在以下位置找到两个这样的文件.classpath和.project,
位置:公用文档下
RAD Studio\9.0\Samples\Delphi\DataSnap\connectors\AndroidClients\AndroidDemoClientApp)
针对这样的文件,XE3的ChangeFileExt函数就存在问题。如下:
ChangeFileExt('C:\Pic\.png', '');
XE2及之前版本返回值:C:\Pic\
XE3版本返回值:C:\Pic\.png
XE4版本返回值:C:\Pic\
由此看出,XE3版本的ChangeFileExt是存在问题的,请大家要小心哦!
以下是不同版本的ChangeFileExt函数源代码,大家可以观察它们的不同之处:
//XE2及之前版本的ChangeFileExt函数 function ChangeFileExt(const FileName, Extension: string): string; var I: Integer; begin I := LastDelimiter('.' + PathDelim + DriveDelim,Filename); if (I = 0) or (FileName[I] <> '.') then I := MaxInt; Result := Copy(FileName, 1, I - 1) + Extension; end; //XE3的ChangeFileExt函数 function ChangeFileExt(const FileName, Extension: string): string; var I: Integer; begin I := FileName.LastDelimiter('.' + PathDelim + DriveDelim); if (I < Low(string)) or (FileName.Chars[I] <> '.') then I := MaxInt; Result := FileName.SubString(0, I) + Extension; end; //XE4的ChangeFileExt函数 function ChangeFileExt(const FileName, Extension: string): string; var I: Integer; begin I := FileName.LastDelimiter('.' + PathDelim + DriveDelim); if (I < 0) or (FileName.Chars[I] <> '.') then I := MaxInt; Result := FileName.SubString(0, I) + Extension; end;