我可以做到这一点,但我的解决方案看起来有点像黑客,所以我想请求SO以获得更优雅的解决方案。我需要获取一个完全限定的文件名列表,并根据路径名中的子字符串将它们分类/复制到几个桶中。
我有三个桶,可能更多,可以改变。假设我有三个这些文件被复制到的桶,比如“foo”,“foo \ bar”和“foo \ baz”。所以文件C:\ mumble \ foo \ bar \ thing.extension进入foo \ bar存储桶,C:\ fumble \ foo \ baz \ this \是\另一个\目录\ bling.extension进入\ foo \ baz bucket和D:\ stumble \ foo \ something.extension进入foo bucket。我需要重定向文件,所以我一直在使用IndexOf(所以我可以创建副本的方向),但这并没有真正起作用,因为\ foo和foo \ bar是相似的,需要不同的存储桶。然后我想我可以使用file.Contains,但是\ foo和\ foo \ baz进入不同的桶,所以需要一个优先级,foo \ bar到一个但是\ foo到另一个。
任何想法如何以相对简单的方式做到这一点?我的代码令人尴尬。
感谢Doug
答案 0 :(得分:0)
尝试类似的东西。
private static readonly Regex _foo = new Regex(@"\\foo\\(?! (bar|baz)\\)",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
private static readonly Regex _foobar = new Regex(@"\\foo\\bar\\",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
private static readonly Regex _foobaz = new Regex(@"\\foo\\baz\\",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
...
foreach (var filename in files)
{
if (_foo.IsMatch(filename))
{
// bucket foo
}
else if (_foobar.IsMatch(filename))
{
// bucket foobar
}
else if (_foobaz.IsMatch(filename))
{
// bucket foobaz
}
}
...
或者,取出_foo中的否定前瞻,然后将其作为if语句的最后一个条件。