C# SearchOption.AllDirectories in variable



我正在尝试使用选项SearchOption.AllDirectory有条件地从某个目录中获取所有文件的列表。如果选中我的表单中的复选框,则结果还将包含子目录中的文件。如果未选中复选框,则将省略子文件夹。所以我的想法是创建可以包含适当代码的变量(字符串ptn = ",SearchOption.AllDirectory";)。但我仍然得到同样的错误"mscorlib.dll 中发生了类型为'System.ArgumentException'的未处理异常",其中包含其他信息:path 包含无效字符。这是我的代码部分:

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);

您将pattern声明为一种string。 在大多数情况下,这是正确的。 但是,您尝试使用System.IO中的SearchOption。 这种特殊的类型不是string,它实际上是一个Enum。 这就是为什么您遇到收到的错误的原因。

与其使用复杂的逻辑、三元或无表现力的代码,不如声明一个Enum。 您可以在此处找到信息。

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

  • SearchOption.AllDirectories
  • SearchOption.TopDirectoryOnly

我建议,仅仅因为你做了大量的逻辑,只是为了确定它应该做什么。 否则,您可以选择将string转换为Enum或声明Enum

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);

最新更新