专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
编写的一个遍历文件夹下所有文件的类,含有一个应用示例
2019-04-14 17:07
发布
生成海报
站内文章
/
模拟电子
12891
0
1208
在“对象浏览器”中查看类的设计
一个简单的应用程序界面
BrowseFiles.cs
类
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.IO; using System.Threading; // 若将遍历目录下所有文件的功能,直接在DoFind()中实现,可能因为该执行过程较长造成UI假死。 // 所以这里采用 BackgroundWorker 来执行遍历操作,并在找到文件时引发 onFindFile 事件, // 用户可编写事件处理程序,对找到的文件执行进一步的操作。 namespace sxLdfang.FindFiles { // 事件委托 public delegate void FindFileEventHandler(object source, FileInfoEventArgs e); // 传递参数(文件名)给事件处理程序的类 public class FileInfoEventArgs : EventArgs { public string FileName = null; } public enum FindFilesStatus { Ready, Finding, Pause } // 运行状态 // 引发事件的类 public class BrowseFiles { BackgroundWorker bw = new BackgroundWorker(); // 新的线程 public event FindFileEventHandler onFindFile; // 声明“事件” bool pause = false; // 暂停标记 FileInfoEventArgs fArgs = new FileInfoEventArgs(); // 传给事件处理程序的参数对象 int count; // 记录找到的文件数量 public int Count { get { return count; } } FindFilesStatus FindStatus; // 当前运行状态 public FindFilesStatus Status { get { return FindStatus; } } int interval = 0; // 激发“事件”的事件间隔(毫秒数) public int Interval { set { if (value >= 0) interval = value; } } public BrowseFiles() // 构造函数 { bw.WorkerReportsProgress = true; // 报告进度 bw.WorkerSupportsCancellation = true; // 可以取消线程的执行 bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); FindStatus = FindFilesStatus.Ready; // 状态:准备好查询 } public void DoFind(string dir) // 查找指定目录下的文件 { if (onFindFile == null) return; // 没定义事件处理程序,结束 if (bw.IsBusy) return; // 当前正在查询,结束 count = 0; // 计数器清零 bw.RunWorkerAsync(dir); // 执行查询 FindStatus = FindFilesStatus.Finding; // 状态:正在进行查询 } public void Pause() // 暂停查找 { FindStatus = FindFilesStatus.Pause; pause = true; } public void Continue() // 继续查找 { FindStatus = FindFilesStatus.Finding; pause = false; } public void Cancel() // 取消查找 { bw.CancelAsync(); } void bw_DoWork(object sender, DoWorkEventArgs e) // 遍历目录下的文件 { BackgroundWorker bw = sender as BackgroundWorker; // 获取线程对象 Queue
dirs = new Queue
(); // 队列存储找到的目录 string dir = e.Argument.ToString(); // 要遍历的起始目录 dirs.Enqueue(dir); // 入队 while (dirs.Count > 0) // 循环直到队列为空 { dir = dirs.Dequeue(); // 取一目录名 try { string[] fs = Directory.GetFiles(dir); // 获取该目录下的所有文件 foreach (string f in fs) { while (pause || bw.CancellationPending) // 处理暂停及取消操作 { if (bw.CancellationPending) return; // 用户取消 Thread.Sleep(20); } bw.ReportProgress(1, f); // 报告当前进度 Thread.Sleep(interval); // 避免快速连续引发事件 } fs = Directory.GetDirectories(dir); // 获取目录下的所有子目录 foreach (string d in fs) { dirs.Enqueue(d); // 各子目录入队 } } catch // 目录或文件无操作权限等 { continue; } } } void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { ++count; // 找到的文件数量增1 fArgs.FileName = e.UserState.ToString(); // 设置参数 onFindFile(this, fArgs); // 执行事件处理程序 } void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { FindStatus = FindFilesStatus.Ready; // 状态:准备好查询 pause = false; // 暂停复位 fArgs.FileName = null; onFindFile(this, fArgs); // 发送null表示结束 } } }
Form1.cs
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 sxLdfang.FindFiles; namespace WindowCs { public partial class Form1 : Form { BrowseFiles bf1 = new BrowseFiles(); // 遍历文件夹中所有文件的类对象 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { bf1.onFindFile += new FindFileEventHandler(bf1_onFindFile); } // 找到文件 void bf1_onFindFile(object source, FileInfoEventArgs e) { if (e.FileName == null) { modifyButtonStatus(); MessageBox.Show("遍历文件夹结束! ", "遍历文件夹", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { txtFiles.AppendText(e.FileName + "/n"); lblMessage.Text = bf1.Count + " files found!"; } } // 选择文件夹用于遍历 private void btnDir_Click(object sender, EventArgs e) { FolderBrowserDialog fd = new FolderBrowserDialog(); fd.ShowNewFolderButton = false; fd.Description = "请选择要遍历的文件夹"; fd.ShowDialog(); txtDir.Text = fd.SelectedPath; modifyButtonStatus(); } // 遍历指定的目录 private void btnFind_Click(object sender, EventArgs e) { txtFiles.Clear(); bf1.Interval = int.Parse(txtInterval.Text); bf1.DoFind(txtDir.Text); modifyButtonStatus(); } // 暂停遍历 private void btnPause_Click(object sender, EventArgs e) { bf1.Pause(); modifyButtonStatus(); } // 继续遍历 private void btnContinue_Click(object sender, EventArgs e) { bf1.Continue(); modifyButtonStatus(); } // 停止遍历 private void btnStop_Click(object sender, EventArgs e) { bf1.Cancel(); modifyButtonStatus(); } // 修改按钮状态 private void modifyButtonStatus() { btnFind.Enabled = (bf1.Status == FindFilesStatus.Ready && txtDir.Text != ""); btnPause.Enabled = (bf1.Status == FindFilesStatus.Finding); btnContinue.Enabled = (bf1.Status == FindFilesStatus.Pause); btnStop.Enabled = (bf1.Status != FindFilesStatus.Ready); } } }
Ta的文章
更多
>>
解决联想笔记本电源选项 电源管理无效
0 个评论
vc创建与原工程除名字外完全相同的工程
0 个评论
嵌入式linux中PCM音频编程实践
0 个评论
编写的一个遍历文件夹下所有文件的类,含有一个应用示例
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮