zoukankan      html  css  js  c++  java
  • C# 文件去仅仅读工具-线程-技术&分享


    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.IO;
    using Mysoft.Common.Multithread;
    
    
    namespace 除去仅仅读
    {
        public partial class Form1 : Form
        {
            public delegate void MyDelegate(string fileName);
    
            private string _errorMessage = "";
            public void DelegateMethod(string fp)
            {
                textBox2.Text = fp + "
    " + textBox2.Text;
                textBox2.SelectionStart = textBox2.Text.Length;
                textBox2.ScrollToCaret();
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
            {
    
            }
            //函数名:button2_Click
            //函数功能:选择文件路径
            //输入參数:object sender, EventArgs e
            //输出參数:无
            private void button2_Click(object sender, EventArgs e)//选择文件路径
            {
                FolderBrowserDialog fbd = new FolderBrowserDialog();
                fbd.ShowDialog();
                string folderName = fbd.SelectedPath; //获得选择的目录路径
                textBox1.Text = folderName;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    string dirPath = textBox1.Text;
                    if (dirPath != "")
                    {
                        textBox2.Text = "";
                        List<string> pathList = new List<string>();
                        string[] dirPathes = Directory.GetDirectories(dirPath, "*.*", SearchOption.TopDirectoryOnly);
    
    
    
                        foreach (var dp in dirPathes)
                        {
                            if (!Directory.Exists(dp))
                            {
                                continue;
                            }                      
                             pathList.Add(dp);
                        }
                        ThreadPool<string> thread = new ThreadPool<string>(pathList);
                        thread.MaxThreadCount = 6;
                        thread.OnProcessData += new ThreadPool<string>.ProcessDataDelegate(SetReadOnly);
                        thread.Start(false);
    
                        LableMessage.Text = "是";
                        LableMessage.ForeColor = Color.Red;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("文件路径存在问题,请又一次选择路径");
                }
            }
    
            private void SetReadOnly(string dirPath)
            {
                try
                {
                    string[] dirPathes = Directory.GetDirectories(dirPath, "*.*", SearchOption.AllDirectories);
                    foreach (var dp in dirPathes)
                    {
                        if (!Directory.Exists(dp))
                        {
                            continue;
                        }
                        if (dp.Substring(dp.ToString().Length - 3, 3).ToUpper() == "bin".ToUpper() || dp.Substring(dp.ToString().Length - 3, 3).ToUpper() == "obj".ToUpper())
                        {
                            DirectoryInfo dir = new DirectoryInfo(dp);
                            dir.Attributes = FileAttributes.Normal & FileAttributes.Directory;
    
                            string[] filePathes = Directory.GetFiles(dp, "*.*", SearchOption.AllDirectories);
                            foreach (var fp in filePathes)
                            {
                                File.SetAttributes(fp, System.IO.FileAttributes.Normal);
                                object[] myArray = new object[1];
                                myArray[0] = fp;
                                BeginInvoke(new MyDelegate(DelegateMethod), myArray);
                            }    
                        }                                 
                    }              
                }
                catch (Exception ex)
                {
                    _errorMessage = ex.Message;
                }
                finally
                {
    
                }
    
            }
    
    
    
            private void textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void LableMessage_Click(object sender, EventArgs e)
            {
    
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                LableMessage.Text = "否";
                LableMessage.ForeColor = Color.Black;
            }
        }
    }
    
    
    
    

    
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Mysoft.Common.Multithread
    {
        /// <summary>
        /// 后台运行接口
        /// </summary>
        public interface IBackgroundExecute
        {
            /// <summary>
            /// 当运行失败时,获取详细的错误信息
            /// </summary>
            string ErrorMessage
            {
                get;
            }
    
            /// <summary>
            /// 更新步骤事件
            /// </summary>
            event UpdateStepDelegate OnUpdateStep;
    
            /// <summary>
            ///更新步骤内进度条事件
            /// </summary>
            event PerformStepDelegate OnPerformStep;
    
            /// <summary>
            /// 运行服务
            /// </summary>
            /// <returns>运行成果返回true。否则返回false</returns>
            bool Exec();
        }
    
        /// <summary>
        /// 更新运行步骤事件參数
        /// </summary>
        public class UpdateStepEventArg : EventArgs
        {
            public string StepInfo;
    
            public int StepMaxCount;
        }
    
        /// <summary>
        /// 步骤递增事件參数
        /// </summary>
        public class PerformStepEventArg : EventArgs
        {
            public int StepCount = 1;
    
            public static PerformStepEventArg SingleStepArg = new PerformStepEventArg();
        }
    
        /// <summary>
        /// 更新步骤托付
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The e.</param>
        public delegate void UpdateStepDelegate(object sender, UpdateStepEventArg e);
    
        /// <summary>
        /// 递增步骤托付
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The e.</param>
        public delegate void PerformStepDelegate(object sender, PerformStepEventArg e);
    }
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Mysoft.Common.Multithread
    {
        /// <summary>
        /// 显示运行进度条的对话框接口
        /// </summary>
        public interface IProgressDlg
        {
            /// <summary>
            /// 获取或设置总步骤数
            /// </summary>
            int StepCount
            {
                get;
                set;
            }
    
            /// <summary>
            /// 获取或设置是否同意取消
            /// </summary>
            bool AllowCancel
            {
                get;
                set;
            }
    
            /// <summary>
            /// 递增滚动栏
            /// </summary>
            void PerformStep();
    
            /// <summary>
            /// 依据指定的进度数来递增滚动栏
            /// </summary>
            /// <param name="stepCount">要递增的进度数</param>
            void PerformStep(int stepCount);
    
            /// <summary>
            /// 设置显示的信息
            /// </summary>
            /// <param name="info">要显示的信息</param>
            void NextSetp(int progressCount, string info);
    
            IRunObject RunObject
            {
                set;
            }
    
            void Show();
    
            void Hide();
        }
    }
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Mysoft.Common.Multithread
    {
        public interface IRunObject
        {
            void Run();
        }
    }
    

    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;
    
    namespace Mysoft.Common.Multithread
    {
        public partial class ProgressDlg : Form, IProgressDlg
        {
            private int _stepCount;
            private Thread _timeThread;
            private ThreadState _threadState;
            private int _nowStep = 0;
            private int _progressCount;
            private IRunObject _runObject;
    
            public ProgressDlg()
            {
                InitializeComponent();
            }
    
            #region IProgressDlg 成员
    
            /// <summary>
            /// 获取或设置总步骤数
            /// </summary>
            int IProgressDlg.StepCount
            {
                get
                {
                    return _stepCount;
                }
                set
                {
                    _stepCount = value;
                    _nowStep = 0;
                }
            }
    
            /// <summary>
            /// 获取或设置是否同意取消
            /// </summary>
            bool IProgressDlg.AllowCancel
            {
                get
                {
                    return this.btnCancel.Enabled;
                }
                set
                {
                    this.btnCancel.Enabled = false;
                }
            }
    
            void IProgressDlg.PerformStep()
            {
                Interlocked.Increment(ref _progressCount);
            }
    
            void IProgressDlg.PerformStep(int stepCount)
            {
                Interlocked.Add(ref _progressCount, stepCount);
            }
    
            void IProgressDlg.NextSetp(int progressCount, string info)
            {
                this.Invoke(new Action<int, string>(NextSetp_internal), progressCount, info);
            }
    
            IRunObject IProgressDlg.RunObject
            {
                set
                {
                    _runObject = value;
                }
            }
    
            void IProgressDlg.Show()
            {
                this.ShowDialog();
            }
    
            void IProgressDlg.Hide()
            {
                this.Invoke(new Action(Close_internal));
            }
    
            #endregion
    
            private void Close_internal()
            {
                _threadState = ThreadState.StopRequested;
                _timeThread.Abort();
                this.Close();
            }
    
            private void NextSetp_internal(int progressCount, string info)
            {
                _nowStep++;
                lblInfo.Text = string.Format("({0}/{1})", _nowStep, _stepCount) + info;
                progressBar1.Maximum = progressCount;
                progressBar1.Value = 0;
                Interlocked.Exchange(ref _progressCount, 0);
            }
    
            private void timeThreadProcess()
            {
                while (_threadState == ThreadState.Running)
                {
                    Thread.Sleep(100);
                    if (_progressCount > 0)
                    {
                        this.Invoke(
                            new Action(PerformStep_internal)
                        );
                    }
                }
                _threadState = ThreadState.Stopped;
            }
    
            private void PerformStep_internal()
            {
                if (_progressCount > 0)
                {
                    progressBar1.Value += Interlocked.Exchange(ref _progressCount, 0);
                }
            }
    
            private void ProgressDlg_Load(object sender, EventArgs e)
            {
                _timeThread = new Thread(new ThreadStart(timeThreadProcess));
                _threadState = ThreadState.Running;
                _timeThread.Start();
    
                _runObject.Run();
            }
        }
    }
    

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Text;
    
    namespace Mysoft.Common.Multithread
    {
        /// <summary>
        /// 运行进度条,并採用多线程来运行程序
        /// </summary>
        public class ProgressRun : IRunObject
        {
            public class ExecCompletedEventArg
            {
                private bool _isSucceed;
                private bool _isException;
                private string _message;
    
                public ExecCompletedEventArg(bool isSucceed, string message)
                {
                    _isSucceed = isSucceed;
                    _isException = false;
                    _message = message;
                }
    
                public ExecCompletedEventArg(string message)
                {
                    _isSucceed = false;
                    _isException = true;
                    _message = message;
                }
    
                public bool IsSucceed
                {
                    get
                    {
                        return _isSucceed;
                    }
                }
    
                public bool IsException
                {
                    get
                    {
                        return _isException;
                    }
                }
    
                public string Message
                {
                    get
                    {
                        return _message;
                    }
                }
            }
    
            public delegate void ExecCompletedDelegate(object sender, ExecCompletedEventArg e);
    
            private BackgroundWorker _backgroundWorker = new BackgroundWorker();
            private bool _isExecute = false;
            private IProgressDlg _progressDlg;
            private IBackgroundExecute _backgroupExecute;
            private int _stepCount;
            private bool _isSuccess = true;
            private string _errorMessage;
    
            public ProgressRun()
                : this(new ProgressDlg())
            {
            }
    
            public ProgressRun(IProgressDlg progressDlg)
            {
                _progressDlg = progressDlg;
                _progressDlg.RunObject = this;
                _backgroundWorker.DoWork += new DoWorkEventHandler(_backgroundWorker_DoWork);
            }
    
            public string ErrorMessage
            {
                get
                {
                    return _errorMessage;
                }
            }
    
            public bool Run(IBackgroundExecute backgroupExecute, int stepCount)
            {
                if (_isExecute)
                {
                    throw new System.Exception("当前后台程序正在运行操作");
                }
    
                _backgroupExecute = backgroupExecute;
                _stepCount = stepCount;
    
                _progressDlg.Show();
    
                return _isSuccess;
            }
    
            void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                _isExecute = true;
                IBackgroundExecute backgroupExecute = (IBackgroundExecute)e.Argument;
                backgroupExecute.OnUpdateStep += new UpdateStepDelegate(backgroupExecute_OnUpdateStep);
                backgroupExecute.OnPerformStep += new PerformStepDelegate(backgroupExecute_OnPerformStep);
                try
                {
                    if (!backgroupExecute.Exec())
                    {
                        _isSuccess = false;
                        _errorMessage = backgroupExecute.ErrorMessage;
                    }
                }
                catch (System.Exception ex)
                {
                    _isSuccess = false;
                    _errorMessage = ex.Message;
                }
    
                _progressDlg.Hide();
            }
    
            void backgroupExecute_OnPerformStep(object sender, PerformStepEventArg e)
            {
                _progressDlg.PerformStep();
            }
    
            void backgroupExecute_OnUpdateStep(object sender, UpdateStepEventArg e)
            {
                _progressDlg.NextSetp(e.StepMaxCount, e.StepInfo);
            }
    
            #region IRunObject 成员
    
            void IRunObject.Run()
            {
                _backgroundWorker.RunWorkerAsync(_backgroupExecute);
                _progressDlg.StepCount = _stepCount;
            }
    
            #endregion
        }
    }
    

    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Text;
    
    namespace Mysoft.Common.Multithread
    {
        public class ThreadPool<T> : IDisposable
        {
            public delegate void ProcessDataDelegate(T data);
    
            private Queue<T> _dataList;
            private int _maxThreadCount = 100;
            private ThreadState _threadState = ThreadState.Unstarted;
            private int _threadCount = 0;
    
            public event ProcessDataDelegate OnProcessData;
    
            public ThreadPool()
            {
                _dataList = new Queue<T>();
            }
    
            public ThreadPool(IEnumerable<T> datas)
            {
                _dataList = new Queue<T>(datas);
            }
    
            public int MaxThreadCount
            {
                get
                {
                    return _maxThreadCount;
                }
                set
                {
                    _maxThreadCount = value;
                }
            }
    
            public ThreadState State
            {
                get
                {
                    if (_threadState == ThreadState.Running
                        && _threadCount == 0)
                    {
                        return ThreadState.WaitSleepJoin;
                    }
                    return _threadState;
                }
            }
    
            public void AddData(T data)
            {
                lock (_dataList)
                {
                    _dataList.Enqueue(data);
                }
                if (_threadState == ThreadState.Running)
                {
                    Interlocked.Increment(ref _threadCount);
                    StartupProcess(null);
                }
            }
    
            public void AddData(List<T> data)
            {
                lock (_dataList)
                {
                    for (int i = 0; i < data.Count; i++)
                    {
                        _dataList.Enqueue(data[i]);
                    }
                }
                if (_threadState == ThreadState.Running)
                {
                    Interlocked.Increment(ref _threadCount);
                    StartupProcess(null);
                }
            }
    
            public void Start(bool isAsyn)
            {
                if (_threadState != ThreadState.Running)
                {
                    _threadState = ThreadState.Running;
                    if (isAsyn)
                    {
                        _threadCount = 1;
                        ThreadPool.QueueUserWorkItem(StartupProcess);
                    }
                    else
                    {
                        Interlocked.Increment(ref _threadCount);
                        StartupProcess(null);
                        while (_threadCount != 0)
                        {
                            Thread.Sleep(100);
                        }
                    }
                }
            }
    
            public void Stop()
            {
                if (_threadState != ThreadState.Stopped
                    || _threadState != ThreadState.StopRequested)
                {
                    _threadState = ThreadState.StopRequested;
                    if (_threadCount > 0)
                    {
                        while (_threadState != ThreadState.Stopped)
                        {
                            Thread.Sleep(500);
                        }
                    }
    
                    _threadState = ThreadState.Stopped;
                }
            }
    
            private void StartupProcess(object o)
            {
                if (_dataList.Count > 0)
                {
                    Interlocked.Increment(ref _threadCount);
                    ThreadPool.QueueUserWorkItem(ThreadProcess);
                    while (_dataList.Count > 2)
                    {
                        if (_threadCount >= _maxThreadCount)
                        {
                            break;
                        }
                        Interlocked.Increment(ref _threadCount);
                        ThreadPool.QueueUserWorkItem(ThreadProcess);
                    }
                }
                Interlocked.Decrement(ref _threadCount);
            }
    
            private void ThreadProcess(object o)
            {
                T data;
                while (_threadState == ThreadState.Running)
                {
                    lock (_dataList)
                    {
                        if (_dataList.Count > 0)
                        {
                            data = _dataList.Dequeue();
                        }
                        else
                        {
                            break;
                        }
                    }
                    OnProcessData(data);
                }
                Interlocked.Decrement(ref _threadCount);
            }
    
            public void Dispose()
            {
                Stop();
            }
        }
    }
    


    
       
    
  • 相关阅读:
    AtCoder Grand Contest 015 题解
    AtCoder Grand Contest 014 题解
    AtCoder Grand Contest 013 题解
    AtCoder Grand Contest 012 题解
    AtCoder Grand Contest 011 题解
    AtCoder Grand Contest 010 题解
    AtCoder Grand Contest 009 题解
    NOIP2017 Day2 题解
    博客园主题备份
    多项式全家桶
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6896202.html
Copyright © 2011-2022 走看看