C# 变量中的C SearchOption.AllDirectories

C# 变量中的C SearchOption.AllDirectories,c#,wpf,C#,Wpf,我正在尝试使用选项SearchOption.AllDirectories有条件地从某个目录获取所有文件的列表。若选中“我的表单”中的复选框,则结果还将包含子目录中的文件。如果未选中复选框,将忽略子文件夹。所以我的想法是创建一个变量,该变量可以包含适当的代码字符串ptn=,SearchOption.AllDirectories;。但我还是犯了同样的错误 mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常,并包含其他信息:路径包含无效字符。 以下是我

我正在尝试使用选项SearchOption.AllDirectories有条件地从某个目录获取所有文件的列表。若选中“我的表单”中的复选框,则结果还将包含子目录中的文件。如果未选中复选框,将忽略子文件夹。所以我的想法是创建一个变量,该变量可以包含适当的代码字符串ptn=,SearchOption.AllDirectories;。但我还是犯了同样的错误 mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常,并包含其他信息:路径包含无效字符。 以下是我的部分代码:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        FolderBrowserDialog folderDlg = new FolderBrowserDialog();
        folderDlg.ShowNewFolderButton = true;
        // Show the FolderBrowserDialog.
        DialogResult result = folderDlg.ShowDialog();
        txtBx1.Text = folderDlg.SelectedPath;
        Environment.SpecialFolder root = folderDlg.RootFolder;
        //declaration and initialization of string variable
        string ptn = "";
        string flTp = @folderDlg.SelectedPath;
        //show string in texblock
        textBlock.Text = flTp;
        try {
            if(subfldr.IsChecked ?? true) {
                ptn = ",SearchOption.AllDirectories";
                //show message in textblock
                txtBlck.Text = "Subfolders are checked";
            }
            string[] fileArray = Directory.GetFiles(flTp,"*.txt"+ptn );
            ...
               }
            catch (IOException ex) 
            {
                System.Windows.Forms.MessageBox.Show("Error: " + ex.Message);
            }
程序正常启动。但在选择目录之后,什么也没有发生。希望有人能指出我做错了什么。
提前谢谢。

试试这样的方法:

string[] fileArray = Directory.GetFiles(flTp,"*.txt", subfldr.IsChecked ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
这将使用条件运算符选择要使用的选项。你可以把它分成几行,以便更好地理解它:

SearchOption option = subfldr.IsChecked ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
string[] fileArray = Directory.GetFiles(flTp,"*.txt", option);
您可以将模式声明为字符串类型。在大多数情况下,这是正确的。但是,您正在尝试使用System.IO中的Search选项。此特定类型不是字符串,而是枚举。这就是为什么你会遇到错误,你的接收

您应该声明一个枚举,而不是复杂的逻辑、三元或非表达式代码。你可以找到这些信息

实际上,您可以调用两个不同的调用:

SearchOption.AllDirectories SearchOption.TopDirectoryOnly 我建议,仅仅是因为你做了大量的逻辑来决定它应该做什么。否则,您可以选择将字符串转换为枚举或声明一个枚举,以以下内容开头:

SearchOption pattern = SearchOption.AllDirectories;
SearchOption pattern = SearchOption.TopDirectoryOnly;
该代码已经过测试,可以正常工作。请从System.IO调用该代码。如果可以,你应该可以这样申报。然后您的代码:

// Left out first parameters to clarify:
SearchOption pattern = SearchOption.AllDirectories;
var contents = Directory.GetFiles("...", "...", pattern);
我相信这就是你想要实现的

// Example:
var pattern = SearchOption.TopDirectoryOnly;
if(chkSubFolder.IsChecked)
     pattern = SearchOption.AllDirectories;

var files = Directory.GetFiles("Your Path", "Your Filter", pattern);
这是因为SearchOption不是字符串类型。它实际上是一个枚举。否则,您需要将ptn声明为枚举而不是字符串。要转换,请查看:它与subfldr一起工作。IsChecked==true?SearchOption.AllDirectory:SearchOption.TopDirectoryOnly。谢谢