【问题标题】:Apply file filters to string [] of filenames , without opening OpenFileDialog将文件过滤器应用于文件名的字符串 [],而不打开 OpenFileDialog
【发布时间】:2013-09-20 19:24:03
【问题描述】:

我想对从Directory.GetFiles() 获得的文件名的string [] 应用过滤器,而不在 OpenFileDialog 中打开它。

有什么方法可以应用所有这些过滤器(我通常会应用到 OpenFileDialog) 例如:

openFileDialog.Filter = "Bitmap Images (*.bmp)|*.bmp|" +
                          "JPEG Images (*.jpeg, *.jpg)|*.jpeg;*.jpg|" +
                          "PNG Images (*.png)|*.png|" + ...;

到字符串 []。

我基本上想从 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 查询或类似的东西。? [我是新手 - 还是学习者]

任何帮助将不胜感激。 提前致谢

【问题讨论】:

    标签: c# string linq filter openfiledialog


    【解决方案1】:

    我会看看下面的文章: http://www.beansoftware.com/ASP.NET-FAQ/Multiple-Filters-Directory.GetFiles-Method.aspx

    它基本上是 GetFiles 函数的包装器,它将采用与您提供给 OpenFolderDialog 的字符串非常相似的字符串,并将返回与模式匹配的文件的字符串数组 (string[])。 (这只是一个递归的 Direectory.GetFiles)

    例如:

    getFiles(path, ".bmp|.jpg") 等

    【讨论】:

      【解决方案2】:

      未经测试,但应该可以工作

      var formats = new string[]{"*.jpg","*.mp3"}
      formats.SelectMany(format => Directory.EnumerateFiles(dirpath, 
                              format, SearchOption.AllDirectories)
             .ToArray();
      

      【讨论】:

        【解决方案3】:

        我认为多次调用 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);
            }
        }
        

        【讨论】:

        • 我不得不承认,我更喜欢你的回答(并且同意)。我的一个批评是,在这种情况下,您应该使用EnumerateFiles 而不是GetFiles,因为where 仍然需要IENumerable,尽管如果目录中有10k+ 个文件,那么只返回正确的文件可能是有意义的类型
        • 谢谢。无论如何,我们必须读取所有文件名,因此使用 EnumerateFiles 不应产生差异。延迟执行有助于不需要读取所有元素。
        • 感谢@UsmanZafar。您的解决方案对我来说效果很好。将您的解决方案标记为答案,因为它的描述和params string[] extensions 的使用给我留下了深刻的印象。再次感谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        • 2016-06-21
        • 1970-01-01
        相关资源
        最近更新 更多