C#SearchOption.AllDirectories in variable

时间:2015-02-03 22:45:34

标签: c# wpf

我试图通过选项SearchOption.AllDirectories有条件地从某个目录获取所有文件的列表。如果选中了我的表单中的复选框,则结果将包含子目录中的文件。如果未选中复选框,则将省略子文件夹。所以我的想法是创建可以包含适当代码的变量(string ptn =“,SearchOption.AllDirectories”;)。但我仍然得到同样的错误 “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);
            }

程序“正常”启动。但选择目录后没有任何反应。希望有人可以指出我做错了什么。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

尝试这样的事情:

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

答案 1 :(得分:0)

您宣布patternstring类型。在大多数情况下,这是正确的。但是,您尝试使用SearchOption中的System.IO。此特定类型不是string,实际上是Enum。这就是你遇到错误的原因。

您应该声明Enum,而不是复杂的逻辑,三元或无意义的代码。您可以找到信息here

你本质上可以调用两个不同的调用:

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