我有一个名为@Inject
的组合框。里面是一个下拉列表,其中包含:
comboFileTypes
按下按钮后,我有以下代码来扫描目录中的文件:
MP4
MOV
MKV
VOB
哪个是硬编码的。我希望改为从组合框动态生成var files = Directory
.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
.Where(s =>
s.EndsWith(".mp4") ||
s.EndsWith(".mov") ||
s.EndsWith(".vob") ||
s.EndsWith(".MP4") ||
s.EndsWith(".MOV") ||
s.EndsWith(".VOB"));
选项,以便用户可以根据需要添加其他类型的文件。 (如果可能的话,也不区分大小写,否则我将两种情况都加进去)
任何帮助将不胜感激。
答案 0 :(得分:4)
您可以通过
从组合框获取值var values = comboFileTypes.Items.Cast<string>()
并像这样使用它:
var files = Directory
.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
.Where(s => values.Any(v => s.EndsWith(v, StringComparison.OrdinalIgnorecase));
答案 1 :(得分:0)
好吧,也许我错过了一些大事,但是...
void onOpen()
{
var selected = comobFileTypes.SelectedItem;
if ( selected != null ) {
string ext = "." + selected.ToString();
var files = Directory.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories).Where(
s => s.EndsWith( ext );
// ...more things...
}
return;
}
此处的关键是组合框具有 SelectedItem 属性,如果未选择任何内容,则可以为null
,或者按住所选的选项。
如果要选择所有扩展名,则可以使用 Items 属性。
void onOpen()
{
string[] items = new string[ comboFileTypes.Items.Length ];
foreach(int i = 0; i < items.Length; ++i) {
items[ i ] = "." + comboFileTypes.Items[ i ].ToString();
}
var files = new List<string>();
var allFiles = Directory.EnumerateFiles( sourceDIR.Text, "*.*", SearchOption.AllDirectories );
foreach(string ext in items) {
files.AddRange( allFiles.Where( s => s.EndsWith( ext ) );
}
// ...more things... with files...
return;
}
希望这会有所帮助。
答案 2 :(得分:0)
从组合框获取所有扩展名:
var extensions = comboFileTypes.Items.Cast<string>().Select(x => "." + x);
通过枚举目录中的所有文件来忽略大小写:
var files = Directory.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories).Where(x => extensions.Any(y => y.Equals(Path.GetExtension(x), StringComparison.OrdinalIgnoreCase)));
您也可以只搜索指定的扩展名:
var files = extensions.AsParallel().SelectMany(x => Directory.EnumerateFiles(sourceDIR.Text, "*" + x, SearchOption.AllDirectories));
答案 3 :(得分:0)
尝试此代码:
List<string> items = new List<string>();
for (int i = 0; i < comboBox1.Items.Count; i++)
{
items.Add(comboBox1.Items[i].ToString().ToLower());
}
var files = Directory
.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
.Where(file => items.Any(item => file.ToLower().EndsWith(item)));
答案 4 :(得分:0)
另一种可能性是使用搜索模式。不幸的是,不可能一次搜索多个模式。但是您可以使用SelectMany
浏览模式列表并将搜索结果展平为一个列表:
var allPatterns = comboFileTypes.Items.Cast<string>();
allPatterns.SelectMany(pattern => Directory.EnumerateFiles(@"F:\temp", $"*.{pattern}", SearchOption.AllDirectories));
文件名将作为模式列表排序