我在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;
还有其他办法吗?
答案 0 :(得分:5)
'['用于标记一组字符的开头(例如,“[A-Z]”)。为了匹配'[',你只需要将它创建为自己的单字符集。 '''不需要进行类似的转义,因为一旦找到前导'[',它只是一个特殊字符。试试C:\[[]test]\*
编辑:
如果您允许任意遮罩,则需要使用StringReplace(Mask, '[', '[[]', [rfReplaceAll])
作为遮罩,而不是文件名。如果你从不使用[a-z]
通配符,我只是从TMask下载并在构造函数中处理它。
答案 1 :(得分:0)
尝试将MatchesMask
用于路径时要非常小心。问题比这里暴露的问题多。有关详细信息,请参阅此blog post。
要修复它,您可以拆分路径和文件名(如果您的用例允许),复制项目目录中的Masks.pas
单元(以便编译而不是'官方'{ {1}}单位)并禁用'['处理,以便没有速度惩罚。
HTH