我想提取文件fname后缀,例如,设fname是“abcde.dat”,则要提取“.dat”我开始用ExtractFileExt(fname)来实现,但所得结果是“.da”,不是“.dat”,后面总是少一个字母“t”,后来我改用copy(fname,length(fname)-3,4)来实现,但结果也和上面一样!这是为什么?

解决方案 »

  1.   

    如楼上所说showmessage(fname);
    ExtractFileExt(fname);//一般提取后缀是不会出现你所说的问题的
      

  2.   

    直接用showmessage(ExtractFileExt(fname))也出错么?
    是不是你赋值给某变量,且该变量已限制了长度 ex:  aStr:string[3]; 如果这样,你上面两方法都只能得到三个字符
      

  3.   

    各位,我是在调试一个很大的程序,许多怪事都是在其中引起的。我担心,是否和程序大有关?
    这个程序我原来在DOS下用bp7开发,当时实模式已不行,改用保护模式也要用大量动态数组。
    我移植到windows下用delphi后,不少已不再用动用数组,不知道这会引起什么问题吗?Delphi编译本来应该非常非常快,但我现在常常恰要等好几秒时间才出来!
      

  4.   


    我的实际源码如下所示:
     fnm:=chain.pdb;
     ext:=copy(fnm,length(fnm)-3,4);
     ch1:=fnm[length(fnm)-3];
     showmessage('fnm="'+fnm+'" 1stch="'+ch1+'" copy 4 chrs, ext="'+ext+'"');结果出来  fnm=“chain.pdb”1stch=“.” copy 4 char, ext=“.pd”
      

  5.   

    ext:=copy(fnm,length(fnm)-3,4); //可能就在这里
    如果ext:string     ==> .pdb
    如果ext:string[3] ==> .pd不知楼主ext 定义有没有限制了长度. 
      

  6.   


    我没有定义长度,所有字符串都用string来定义。实际上,逻辑不会错的,copy语句我频繁使用,就在我这个unit中我查了一下共就有46处,
    其他45处都正确,就是在这里加入第46个时出错了!所以感到非常奇怪!我认为,问题只可能是其他因素引起,例如我在前面7楼提到的,数据大,而使用静态数组,
    很少使用create、free来编程,我真不知道如何检查这种错误!还有,是否会是病毒,或别的什么因素。
      

  7.   

    我在工具条上设置了一个新的speedbuttom,并再使用copy命令做同样的工作,结果完全正确了!
    但原来那个地方(File菜单下的一个Open命令)的那个copy语句还是稳定地出错!不可思议透顶了!!
      

  8.   

    显然,你那段代码单独测试是不会有问题的。既然你的程度是从BP7的代码移植来的,如果不想大量改动的话,应该严格使用shortstring。也就是,要么程序使用{$H-}指示,要么所有原来的string类型声明为string[255](如果原来的声明是string[xx]则不要改)。
      

  9.   


    我把程序中原来加入的语句{$A+,B-,D+,E+,F-,G+,I+,L+,N-,P-,Q-,R+,S+,T-,V+,X+,Y+}增加了{$H-}后,引起另一处  ua:=dir+'\libs\static.do.htm';
      if fileexists(ua) then
        shellExecute(0,'open','iexplore.exe',pchar(ua),nil,SW_SHOWNORMAL)
      else
       begin
         showmessage(ua+' not found.');
         exit;
       end;这一段语句出错,不过我暂时封了这一段来试,发现原来的问题也不能得到解决。
      

  10.   


    我后来进一步作了比较:发现出错的地方和后来做试验并成功的地方,除了地点外,差别只有一点,即出错处的fname是从过程外引入的string,而成功处的fname则是直接赋予的常数字符串,但我想这也不可能影响copy语句的执行的!
    另外你说的string的short或long,我想也不可能影响copy语句的执行的,因为实际的fname长度都很短。
      

  11.   

    “发现出错的地方和后来做试验并成功的地方,除了地点外,差别只有一点,即出错处的fname是从过程外引入的string,而成功处的fname则是直接赋予的常数字符串,”那你在引入fname这个string后,首先先showmessage(fname),看一下fname是不是你想象中的fname呢?
      

  12.   


    这是我首先做的检查,就放在copy语句之前的一行,结果证明fname没错。
      

  13.   

    还有这种怪事了。那你:
    ext := fname;
    Delete(ext, 1, length(ext) - 4);
    //...
      

  14.   

    逐个输出ord(fname[i])看看有没有不可视的字符,到底几个字符。
      

  15.   

    各位,抱歉了,问题找到,是我疏忽了。就是10楼指出的毛病!我的程序中copy命令用的很多,其他地方都正确,出错的是一个特殊
    过程,它是从我原来DOS程序中拷贝来的,其中有一个string3的类型,
    string3类型定义为string[3]; 这次我需要提取后缀,就把后缀名放
    在原来string3一类中,由于这个过程中变量很多,没有注意string3
    与string的差别,从而出现了这一“怪事情”。结贴了,谢谢各位!