当掩码包含"["时,我该如何使用TMask?

3

我一直在使用Delphi 2010中的TMask进行实验,除了一个情况外,它似乎都按预期工作:当掩码名称包含 [ 或 ] 时,掩码似乎总是返回 false。例如:

var
  MaskObj : TMask;
begin
  MaskObj:= TMask.Create('c:\[test]\*');
  try
    Result:= MaskObj.Matches('c:\[test]\text');
  finally
    FreeAndNil(MaskObj);
  end;
end;

返回 false。...

是的,[ 和 ] 是文件名中合法的字符。那么如果我想排除例如 c:[test]* 中的所有文件,我该怎么做呢?我的唯一解决方案是在检测到 [ 时进行 StringReplace,但这对于大量文件来说会很

if (pos('[', Mask)>0) then
begin
  mask:= ReplaceString(Mask, '[','_', etc...
  // and do the same for the file name---
end;

有其他的方法吗?

什么是TMask?它属于哪个单元?我已经尝试过D2010的新功能,但我不知道你在指什么。 - Mason Wheeler
3
TMask在Masks单元中。我想它从Delphi 2开始就存在了。 - Lobuno
@Mason:它从D1或2开始就存在了(TMaskEdit在内部使用它)。实际上,它比Lobuno展示的更容易使用。只需将Masks添加到uses子句中,然后使用MatchesMask()函数即可。无需设置和拆除对象实例。 - Ken White
如果您只想查找文件名是否存在于给定目录中,可以使用 shlwapi.dll 中的 PathIsPrefix API 函数。PathIsPrefix('C:\[test]\', 'C:\[test]\text')。不需要掩码,因此也不需要转义。 - Rob Kennedy
2个回答

6

'['用于标记一组字符的开始(例如,“[A-Z]”)。为了匹配单独的'[',您只需要将其创建为自己的单字符集。不需要类似地转义']',因为它只是一个特殊字符,一旦找到前导'['。尝试C:\[[]test]\*

编辑:

如果允许任意掩码,则需要使用StringReplace(Mask,'[','[[]',[rfReplaceAll])用于掩码,但不适用于文件名。如果从未使用[a-z]通配符,我会从TMask下降,并在构造函数中处理它。


基本上你仍然需要使用StringReplace调用。不过,你可以通过删除“if pos”调用来加快速度,因为stringReplace在内部执行此操作。 - Mason Wheeler

0

在尝试使用MatchesMask进行路径匹配时要非常小心。这里暴露的问题不止一个。详细信息请参阅博客文章

为了修复它,您可以拆分路径和文件名(如果您的使用情况允许的话),将Masks.pas单元复制到项目目录中(以便编译而不是“官方”的Masks单元),并禁用“[”处理,以避免速度损失。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接