为什么这个比较失败了

时间:2013-05-30 06:33:02

标签: delphi string-comparison

我有以下参数

的功能

aFile =完整文件名

aFolder =要复制/移动到

的foldername

aGuid =分配文件的指南

aAction =如何处理fil(移动或复制)

如果Trim(NewFile)= Trim(aFile),我会猜测该行,然后如果旧文件与新文件相同,则应该停止代码执行任何操作。但事实并非如此。即使文件相同也执行FileExists(NewFile)的行。

在我的调试日志中,我有

30-05-2013 08:10:3​​4:840#新文件:C:_Delphi_Compiled \ HomeSuite \ Debug \ indbo \ computerfladskaerm \ 968ED02C-21B5-4582-8A49-8463E01ADCB3.pdf

30-05-2013 08:10:3​​4:841#旧文件:C:_Delphi_Compiled \ HomeSuite \ Debug \ Indbo \ computerfladskaerm \ 968ED02C-21B5-4582-8A49-8463E01ADCB3.pdf

据我所知,这些名字是相同的

function DocumentHandle(aFile, aFolder, aGuid: string; aAction: TDocumentAction): string;
const
  CopyMsg = 'Der findes allerede en fil med det navn!' + sLineBreak +
            'Filen omdøbes derfor til et unikt navn';
var
  NewFile: string;
begin
  Result := aFile;
  try
    NewFile := ExtractFileName(aFile);
    NewFile := aFolder + NewFile;
    if Trim(NewFile) = Trim(aFile) then
      Exit;
    if FileExists(NewFile) then
      begin
        NewFile := ExtractFileExt(aFile);
        NewFile := aFolder + CleanGuid(aGuid) + NewFile;
        MessageDlg(CopyMsg, mtWarning, [mbOk], 0);
      end;
    case aAction of
      daCopy:
        begin
          if CopyFile(PwideChar(aFile), PwideChar(NewFile), False) then
            Result := NewFile;
        end;
      daMove:
        begin
          if MoveFile(PwideChar(aFile), PwideChar(NewFile)) then
            Result := NewFile;
        end;
    end;
  except
    on E: exception do
      Logfile.Error('U_Documents.DocumentHandle: ' + E.Message);
  end;
end;

3 个答案:

答案 0 :(得分:5)

比较是区分大小写的,您有indbo或。文件名中包含Indbo。 你可以比较,例如

UpperCase(f1)=UpperCase(f2)

if SameText(f1,f2) then ...

答案 1 :(得分:2)

您可以使用SHParseDisplayName()IShellFolder.ParseDisplayName()将文件路径转换为PIDL,然后使用IShellFolder.CompareIDs()进行比较,而不是比较可能导致误报的字符串。这样您不仅可以比较混合大小写的文件,还可以比较短文件名和长文件名等。

答案 2 :(得分:0)

看起来你在有意义的部分之后将垃圾数据保存在你的宽字符串中,你可以在字符串上尝试长度(aMessage)并找出长度是否相同..