我试图通过选项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);
}
程序“正常”启动。但选择目录后没有任何反应。希望有人可以指出我做错了什么。 提前谢谢。
答案 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)
您宣布pattern
为string
类型。在大多数情况下,这是正确的。但是,您尝试使用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);