var
path:string
begin
path:='D:\SQLEVAL\x86\setup\MingSoft.exe';
end;如何将上面的字符串截取成  'MingSoft'我的意思是只要文件名   
字符串中有四个  '\',怎么求出第N个 '\' 的位置

解决方案 »

  1.   

    function GetFileNameNoExt(const AFileName: String): String;
    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;
      

  2.   

    ShowMessage(StringReplace(ExtractFileName(path),ExtractFileExt(path),'', []));
      

  3.   

    老之的方法最好.如果你要找最后一个斜线的话,可以这样遍历:for i:=length(path) downto 1 do
      if path[i]='\' then 
      begin
        showmessage('最后一条斜杠的位置是:' + IntToStr(i));
        exit;
      end;(不知道你说的第N条是说任意某条还是最后一条,任意的话,也可以使用多次PosEx来找)另: 不知道有没有可以反向找位置的函数呢?
      

  4.   

    老之的方法我觉得不是最好的
    因为有以下原因
    1. StringReplace 存在需要字符串匹配, 效率也不是最优
    2. StringReplace 对于某些情况下会有问题, 如:
       unname1.txtrar.txt, 则老之得到是不正确的结果 unname1rar.txt 而非 unname1.txtrar
      

  5.   

    var
    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;
      

  6.   

    想起一样事,其实要获得那个文件名的话:showmessage(ChangeFileExt(ExtractFileName(Path), ''));应该没异议吧.
      

  7.   

    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;可以看出, ChangeFileExt没有问题
      

  8.   

    我写过一个lastindexof的函数,用递归可以实现