var
path:string
begin
path:='D:\SQLEVAL\x86\setup\MingSoft.exe';
end;如何将上面的字符串截取成 'MingSoft'我的意思是只要文件名
字符串中有四个 '\',怎么求出第N个 '\' 的位置
path:string
begin
path:='D:\SQLEVAL\x86\setup\MingSoft.exe';
end;如何将上面的字符串截取成 'MingSoft'我的意思是只要文件名
字符串中有四个 '\',怎么求出第N个 '\' 的位置
begin
Result := ExtractFileName(AFileName);
Result := Copy(Result, 1, Length(Result) - Length(ExtractFileExt(AFileName)));
end;function StrPosN(const str, subStr: PChar; N: Integer): PChar;
var
i: Integer;
iSubLen: Integer;
begin
if N <= 0 then
Result := Nil
else
begin
iSubLen := StrLen(subStr);
Result := StrPos(Str, subStr);
for i := 2 to N do
begin
if Result = nil then
Exit;
Result := StrPos(Result + iSubLen, subStr);
end
end;
end;function PosN(const Str, subStr: String; N: Integer): Integer;
var
pStr, pRes: PChar;
begin
pStr := PChar(Str);
pRes := StrPosN(pStr, PChar(subStr), N);
if Assigned(pRes) then
Result := pRes - pStr + 1
else
Result := 0;
end;procedure TForm1.Button1Click(Sender: TObject);
const path = 'D:\SQLEVAL\x86\setup\MingSoft.exe ';
var
i: Integer;
begin
ShowMessage(GetFileNameNoExt(path));
for i := 1 to 5 do
ShowMessage(IntToStr(PosN(path,'\', i)));
end;
if path[i]='\' then
begin
showmessage('最后一条斜杠的位置是:' + IntToStr(i));
exit;
end;(不知道你说的第N条是说任意某条还是最后一条,任意的话,也可以使用多次PosEx来找)另: 不知道有没有可以反向找位置的函数呢?
因为有以下原因
1. StringReplace 存在需要字符串匹配, 效率也不是最优
2. StringReplace 对于某些情况下会有问题, 如:
unname1.txtrar.txt, 则老之得到是不正确的结果 unname1rar.txt 而非 unname1.txtrar
path:string;
i:integer; //增加一个数值
a:string; //增加一个字符串以放置最后的获取的文件名
begin
path:='D:\SQLEVAL\x86\setup\MingSoft.exe';
i:=pos('\',path); //此处为找到第一个'\'时位置
while i<>0 do //此处为当再也找到'\'时,那么剩下的字符串即是所要的值,如剥笋样
begin 一层层的将'\'剥去
delete(path,1,i); //剥去找到的有'\'前面的值
i:=pos('\',path); //重新开始找
end;
a:=path; //如果i=0了,这时得出的值就是去掉了所有‘\',只剩下‘MingSoft.exe’了
end;
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;可以看出, ChangeFileExt没有问题