Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将文件筛选器应用于文件名的字符串[],而不打开OpenFileDialog_C#_String_Linq_Filter_Openfiledialog - Fatal编程技术网

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[]扩展名的使用给我留下了深刻的印象。再次感谢