我正在尝试使用选项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);