winforms MessageBox在搜索两个关键字时不显示文件夹路径,但在搜索一个关键字时显示文件夹路径

7kqas0il  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(137)
try
            {

                string[] SetupFolderKeywords = {"Setup", "Installed"}; 
                DirectoryInfo SearchedDirectory = new DirectoryInfo(Game.SelectedPath);
                FileSystemInfo[] filesAndDirs = SearchedDirectory.GetFileSystemInfos($"*{SetupFolderKeywords[0]}*|*{SetupFolderKeywords[1]}*"); // <-- This doesn't work
                // FileSystemInfo[] filesAndDirs = SearchedDirectory.GetFileSystemInfos("*" + SetupFolderKeywords[0] + "*"); <-- This Works
                foreach (FileSystemInfo foundFile in filesAndDirs)
                {
                  string FullName = foundFile.FullName;
                  MessageBox.Show(FullName);
                }

            }
            catch (IOException ExpMoveFolder)
            {
                MessageBox.Show(Convert.ToString(ExpMoveFolder));
            }

我试图在Game.SelectedPath目录中查找包含关键字“Setup”或“Installed”的文件夹(我使用FolderBrowserDialog选择了此文件夹),并使MessageBox显示其路径。
当我尝试搜索与某个关键字匹配的文件夹时,MessageBox显示该文件夹的路径。它工作得很好,但当我尝试搜索关键字“Setup”或“Installed”时,MessageBox根本不显示。
当我尝试查找其中任何一个关键字而不是只查找一个关键字时,visual studio中没有出现错误消息或警告,也没有发生程序异常。

dw1jzc5e

dw1jzc5e1#

你不能用一个调用来搜索多个模式。你尝试的布尔表达式只被解释为一个模式,当然,没有匹配该模式的条目。如果你想匹配多个模式,你必须进行多个调用。一个选项可能是这样的:

var folder = new DirectoryInfo(Game.SelectedPath);
var entries = folder.EnumerateFileSystemInfos(patterns[0]);

for (var i = 1; i < patterns.Length; i++)
{
    entries = entries.Concat(folder.EnumerateFileSystemInfos(patterns[i]));
}

foreach (var entry in entries)
{
    // Use entry here.
}

编辑:
我刚创建了这个文件夹:

然后执行以下代码:

var patterns = new[] { "123", "789" };
var folder = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Test"));
var entries = folder.EnumerateFileSystemInfos($"*{patterns[0]}*");

for (var i = 1; i < patterns.Length; i++)
{
    entries = entries.Concat(folder.EnumerateFileSystemInfos($"*{patterns[i]}*"));
}

foreach (var entry in entries)
{
    Console.WriteLine(entry.Name);
}

这基本上就是我在上面发布的内容,只是我在EnumerateFileSystemInfos调用中添加了通配符,而原始代码要求它们已经在strings中了。

File123.txt
Folder123
File789.txt
Folder789

然后我将过滤器更改为:

var patterns = new[] { "456" };

并再次运行代码,得到以下输出:

File456.txt
Folder456

很明显,代码完全按照它应该的方式工作,如果你做的不起作用,那么你做错了。如果你不能找出你做错了什么,我建议你更新你的问题,并添加新的相关信息。

相关问题