C# 将文件筛选器应用于文件名的字符串[],而不打开OpenFileDialog
我想对从C# 将文件筛选器应用于文件名的字符串[],而不打开OpenFileDialog,c#,string,linq,filter,openfiledialog,C#,String,Linq,Filter,Openfiledialog,我想对从目录.GetFiles()中获取的文件名的字符串[]应用一个过滤器,而无需在OpenFileDialog中打开它 是否有任何方法可以应用所有这些过滤器(我通常会应用于OpenFileDialog) e、 g: 到字符串[] 我基本上想从FolderBrowserDialog中选择文件夹,并且只从文件夹中选择所选文件-我正在尝试找到某种方法以静默方式执行此操作(将参数设置为OpenFileDialog,但不打开它) 我只是试了一下 OpenFileDialog openFileDialog
目录.GetFiles()
中获取的文件名的字符串[]
应用一个过滤器,而无需在OpenFileDialog中打开它
是否有任何方法可以应用所有这些过滤器(我通常会应用于OpenFileDialog)
e、 g:
到字符串[]
我基本上想从FolderBrowserDialog中选择文件夹,并且只从文件夹中选择所选文件-我正在尝试找到某种方法以静默方式执行此操作(将参数设置为OpenFileDialog,但不打开它)
我只是试了一下
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = folderdialog.SelectedPath; // here I get my folder path
openFileDialog.Filter = "Bitmap Images (*.bmp)|*.bmp|" +
"JPEG Images (*.jpeg, *.jpg)|*.jpeg;*.jpg|" +
"PNG Images (*.png)|*.png";
string [] fnms = openFileDialog.FileNames; // I wished this string arry to get poplulated with filtered file list - but doh! Obviously it didn't.
谁能帮我找到解决这个问题的办法。
有没有办法无声地调用OpenFiledDialog?或者是否会有任何LINQ查询用于此问题或类似的问题。?[我是个新手,但还是个学习者]
任何帮助都将不胜感激。
提前感谢我想看一下下面的文章: 它基本上是一个GetFiles函数的包装器,它将接受一个与您给OpenFolderDialog的字符串非常相似的字符串,并将返回一个与模式匹配的文件字符串数组(string[])。(它只是一个递归Direectory.GetFiles) 例如:
获取文件(路径“.bmp |.jpg”)等。我想看一下下面的文章: 它基本上是一个GetFiles函数的包装器,它将接受一个与您给OpenFolderDialog的字符串非常相似的字符串,并将返回一个与模式匹配的文件字符串数组(string[])。(它只是一个递归Direectory.GetFiles) 例如:
getFiles(路径“.bmp |.jpg”)等。未经测试,但应能正常工作
var formats = new string[]{"*.jpg","*.mp3"}
formats.SelectMany(format => Directory.EnumerateFiles(dirpath,
format, SearchOption.AllDirectories)
.ToArray();
未经测试但应该有效
var formats = new string[]{"*.jpg","*.mp3"}
formats.SelectMany(format => Directory.EnumerateFiles(dirpath,
format, SearchOption.AllDirectories)
.ToArray();
我不认为多次调用Directory.GetFiles是个好主意,因为这是一个IO操作。我建议您执行以下操作:
static string[] GetFiles(string directory, params string[] extensions)
{
var allowed = new HashSet<string>(extensions, StringComparer.CurrentCultureIgnoreCase);
return Directory.GetFiles(directory)
.Where(f => allowed.Contains(Path.GetExtension(f)))
.ToArray();
}
static void Main(string[] args)
{
string[] files = GetFiles(@"D:\My Documents", ".TXT", ".docx");
foreach(var file in files)
{
Console.WriteLine(file);
}
}
静态字符串[]获取文件(字符串目录,参数字符串[]扩展名)
{
允许的变量=新哈希集(扩展名,StringComparer.CurrentCultureIgnoreCase);
return Directory.GetFiles(目录)
.Where(f=>allowed.Contains(Path.GetExtension(f)))
.ToArray();
}
静态void Main(字符串[]参数)
{
string[]files=GetFiles(@“D:\My Documents”、“.TXT”、“.docx”);
foreach(文件中的var文件)
{
Console.WriteLine(文件);
}
}
我认为多次调用Directory.GetFiles不是一个好主意,因为这是一个IO操作。我建议您执行以下操作:
static string[] GetFiles(string directory, params string[] extensions)
{
var allowed = new HashSet<string>(extensions, StringComparer.CurrentCultureIgnoreCase);
return Directory.GetFiles(directory)
.Where(f => allowed.Contains(Path.GetExtension(f)))
.ToArray();
}
static void Main(string[] args)
{
string[] files = GetFiles(@"D:\My Documents", ".TXT", ".docx");
foreach(var file in files)
{
Console.WriteLine(file);
}
}
静态字符串[]获取文件(字符串目录,参数字符串[]扩展名)
{
允许的变量=新哈希集(扩展名,StringComparer.CurrentCultureIgnoreCase);
return Directory.GetFiles(目录)
.Where(f=>allowed.Contains(Path.GetExtension(f)))
.ToArray();
}
静态void Main(字符串[]参数)
{
string[]files=GetFiles(@“D:\My Documents”、“.TXT”、“.docx”);
foreach(文件中的var文件)
{
Console.WriteLine(文件);
}
}
我必须承认,我更喜欢你的答案(并同意它)。我的一个批评是,在本例中,您应该在GetFiles
上使用EnumerateFiles
,因为您仍然需要where
的IENumerable,尽管如果目录中有10k+个文件,那么只返回正确的typesthanks可能是有意义的。无论如何,我们都必须读取所有文件名,因此使用枚举文件不会产生任何差异。延迟执行有助于不需要读取所有元素。谢谢@UsmanZafar。你的解决方案对我很有效。将您的解决方案标记为答案,因为它描述得很好,而且params string[]扩展名的使用给我留下了深刻的印象。我不得不承认,我更喜欢你的答案(并且同意)。我的一个批评是,在本例中,您应该在GetFiles
上使用EnumerateFiles
,因为您仍然需要where
的IENumerable,尽管如果目录中有10k+个文件,那么只返回正确的typesthanks可能是有意义的。无论如何,我们都必须读取所有文件名,因此使用枚举文件不会产生任何差异。延迟执行有助于不需要读取所有元素。谢谢@UsmanZafar。你的解决方案对我很有效。将您的解决方案标记为答案,因为它描述得很好,而且params string[]扩展名的使用给我留下了深刻的印象。再次感谢