2016-09-15 65 views
0

当从单元System.Masks使用TMask时,我想知道是否可以过滤一组不同的文件名(或任何其他字符串)。如果是这样,我如何过滤* .foo和* .bar之类的东西?使用MatchesMask过滤几个不同的文件名

使用';'在不同的领域之间不工作(显然,在阅读源代码后)。

尽管有类似*。[fb] [oa] [或]可以过滤* .foo和* .bar文件,它也会过滤* .far,* .boo等。

到目前为止我还没有时间完全理解原始的源代码。特别是我想知道'msMBCSLiteral'用于什么。这可以在这种情况下有用吗?还有其他方法可以实现吗?

PS:我知道如何通过其他方式解决过滤(为过滤编写一些自定义代码)。但是,因为我想重用一些已经存在的代码,所以我想使用TMask。

+0

我很确定这是不可能的。我找不到明确说明这一点的文档,但似乎是从MatchesMask的描述开始。这也是在这个问题的接受答案中声明:http://stackoverflow.com/questions/12726756/how-to-pass-multiple-file-extensions-to-tdirectory-getfiles – DNR

+1

是否提供正则表达式?根据你对'System.Masks'的使用,而不仅仅是'Masks',你正在使用最新版本的Delphi。在这种情况下,正则表达式会非常简单。 –

回答

3

MatchesMask函数没有用于并行检测两组不同字符的函数。 msMBCSLiteral状态用于检测多字节字符的首字节,而不用于检测两个分支中的任何一个。

要两次匹配两个不同的掩码,调用函数:

if MatchesMask(filename, '*.foo') or MatchesMask(filename, '*.bar') then 
    // ... 

你也可以使用正则表达式; \.(foo|bar)$会工作,只要你设置忽略大小写的标志。

如果您有一个支持Bash式口罩的库,那么您可以使用*.{foo,bar}。我不知道Delphi有这样的库,但这并不意味着如果你看了,就找不到。

+0

不幸的是,我使用的库需要一个(一个)TMask,MatchesMask调用在内部执行。 – CWBudde

+0

由于似乎没有机会让它工作,我倾向于接受这个答案。但是,我仍然等待几天,直到我这样做。也许有人想出了一个创造性的解决方案。 – CWBudde