• LINQ to Objects和多线程实现文件查找与分组


    本博文接着上几篇LINQ to Object和多线程的相关博文,用LINQ to Object和多线程实现文件查找与分组的Demo作为LINQ to Object 的一个小结。

    程序的功能如下:点击界面右上角按钮选择一个文件夹,多线程加载文件,LINQ进行相关的查询,实现分组查找等功能。

    程序的注释中,DebugLZQ加入了很详细的注释,以及,LZ代码写作的流程,因此这里不做更多的介绍,LINQ和多线程的相关技能请参考DebugLZQ前面的几篇博文。

    代码如下:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.IO;
    
    ///
    ///DebugLZQ
    ///http://www.cnblogs.com/DebugLZQ
    ///LINQ to Object & 线程操作
    namespace 文件查找与分组
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private string filePath = "";
            /////////////////////////////////////////////
            //a4
            //得到选定目录下的文件类型
            private string[] GetFileTypes()
            {
                string[] files = Directory.GetFiles(filePath, "*.*", SearchOption.AllDirectories);//获得目录下所有的文件
    
                //LINQ获得文件分组
                var filesLookup = files.ToLookup(f=>f.Substring(f.LastIndexOf('.')).ToUpper());
    
                //从分组中获得Key(即文件类型),并排序
                var fileTypes = from t in filesLookup
                                orderby t.Key
                                select t.Key;
                return fileTypes.ToArray();
    
            }
            //
            //b6
            //根据指定类型获得文件名
            private string[] GetFilesByType(string type)
            {
                string[] files = Directory.GetFiles(filePath, "*.*", SearchOption.AllDirectories);//获得目录下所有的文件
    
                var filesByType = from f in files
                                  where f.Contains(type.ToLower())||f.Contains(type)
                                  select f;
    
                return filesByType.ToArray();
            }
            //
            //c8
            //查找文件
            private string[] FindFile(string str)
            {
                string[] files = Directory.GetFiles(filePath, "*.*", SearchOption.AllDirectories);//获得目录下所有的文件
    
                var filesTake = from f in files
                                where f.Contains(str)
                                select f;
                return filesTake.ToArray();
            }
            ////////////////////////////////////////////
    
            //a2
            //访问磁盘,读取文件
            private void LoadFile()
            {
                Thread t = new Thread(new ThreadStart(loadfile));
                t.Start();           
            }
    
            private delegate void loadfileDelegate();
            
            //a3
            private void loadfile()
            {
                if (this.InvokeRequired == true)//注意这里
                {
                    loadfileDelegate lfd = new loadfileDelegate(loadfile);
                    this.Invoke(lfd);
                    return;
                }
    
                //获得文件类型
                string[] fileTypes = GetFileTypes();
    
                //Binding
                fileTypeLst.DataSource = fileTypes;
    
            }
            
            //a1
            private void btnSelDir_Click(object sender, EventArgs e)
            {
                if (folderBrowserDialog1.ShowDialog()== System.Windows.Forms.DialogResult.OK )
                {
                    filePath = folderBrowserDialog1.SelectedPath;
                    txtFolder.Text = folderBrowserDialog1.SelectedPath;
                    LoadFile();
                }
            }
            //b5
            private void fileTypeLst_SelectedIndexChanged(object sender, EventArgs e)
            {
                //根据文件类型获得文件名
                string[] files = GetFilesByType(fileTypeLst.SelectedItem.ToString());
    
                //Binding
                fileLst.DataSource = files;
            }
            //c7
            private void txtFind_TextChanged(object sender, EventArgs e)
            {
                if (txtFind.Text.Length == 0)
                {
                    return;
                }
    
                string[] files = FindFile(txtFind.Text);
    
                //Binding
                fileLst.DataSource = files;
            }
        }
    }

    程序的界面,及运行结果如下:

  • 相关阅读:
    Sublime Text3下使用Python,REPL的安装与快捷键设置方法
    2018最新版本Sublime Text3注册码(仅供测试交流使用)
    Simple website approach using a Headless CMS: Part 3
    Simple website approach using a Headless CMS: Part 2
    Simple Website Approach Using a Headless CMS: Part 1
    Top 19 Headless CMS for Modern Publishers
    Headless CMS
    12位至今仍在世的重要工程师,让我们来认识这些程序界的大前辈
    Linux操作系统(第二版)(RHEL 8/CentOS 8)—内容简介—前言—清华大学出版社—张同光
    List of open source real-time operating systems
  • 原文地址:https://www.cnblogs.com/DebugLZQ/p/2767717.html
Copyright © 2020-2023  润新知