3

使用 c# GetDirectories 在搜索目录下立即检索文件夹。该代码适用于搜索的所有其他目录,但单个目录除外。具体来说,GetDirectories 返回两个不同的文件夹,一个包含搜索模式,而另一个不包含搜索模式。

通配符搜索模式*43*在我的示例中。

几乎所有我能想到的都试过了。
奇怪的是,如果我更改“WINCE_TEST_IMAGE_41”文件夹名称的任何一个字符的大小写,则返回与(再次)GetDirectories搜索模式匹配的预期(和正确)单个目录。"*43*"例如,将 更改"C"为...然后返回"c"包含...的单个目录43

设置:
我安装了 .NET Framework SDK 4.8(截至 2019 年 9 月 3 日的最新安装)。
1. 创建文件夹“C:\Temp\WINCE_OS_IMAGES”
2. 在文件夹中创建子文件夹:
* “WINCE_TEST_IMAGE_40”
* “WINCE_TEST_IMAGE_41”
* “WINCE_TEST_IMAGE_42”
* “WINCE_TEST_IMAGE_43”
* “WINCE_TEST_IMAGE_44”。

这样目录结构就是:

C:\温度
      \WINCE_OS_IMAGES
            \WINCE_TEST_IMAGE40
            \WINCE_TEST_IMAGE41
            \WINCE_TEST_IMAGE42
            \WINCE_TEST_IMAGE43
            \WINCE_TEST_IMAGE44

代码:
v是该方法的参数输入,因此我分配了一个值来帮助重现该问题。

string v = "43";

string[] dirs2 = Directory.GetDirectories(@"C:\Temp\WINCE_OS_IMAGES", "*" + 
    v + "*", SearchOption.TopDirectoryOnly);

foreach (string str in dirs2)
{
    Console.WriteLine(str);
}

预期: GetDirectories语句仅返回以 . 结尾的目录"43"

实际:
GetDirectories 语句返回两个目录,一个以 . 结尾,"41"另一个以"43".

4

2 回答 2

1

GetFiles的文档(没有找到此语句GetDirectories)说:

注意
因为此方法会检查具有 8.3 文件名格式和长文件名格式的文件名,所以类似于“*1*.txt”的搜索模式可能会返回意外的文件名。例如,使用“*1*.txt”搜索模式会返回“longfilename.txt”,因为等效的 8.3 文件名格式是“LONGFI~1.TXT”。

我认为对于GetDirectories.

因此,您必须自己过滤结果(例如使用正则表达式或使用string.Contains())。

var dirs2 = Directory.GetDirectories(@"C:\Temp\WINCE_OS_IMAGES", "*" + 
                                     v + "*", SearchOption.TopDirectoryOnly)
    .Where(d => d.Contains(v));

foreach (string str in dirs2)
{
    Console.WriteLine(str);
}

注意:您正在搜索数字,因此字符大小写不是问题。如果您需要不区分大小写的搜索,则不能简单地使用Contains,因为它没有允许不区分大小写的搜索的重载。您可以使用Panic 上校对不区分大小写的 'Contains(string)'问题的回答或与

v = v.ToLowerInvariant();
...
.Where(d => d.ToLowerInvariant().Contains(v));
于 2019-09-04T13:38:17.507 回答
0
string[] dirs2 = Directory.GetDirectories(@"C:\Temp\WINCE_OS_IMAGES", "*" +
            v + "*", SearchOption.TopDirectoryOnly);

删除空白区域。

于 2019-09-03T18:39:28.857 回答