高分求教C#遍历指定目录下所有文件(包括子目录中的文件)较好的办法?

情傷 2012-05-25 04:23:08
最近要做一个Winform,实现指定文件夹目录后,扫描该目录下所有的文件,包括该文件夹下的子目录及孙目录中的文件
例:扫描D盘中所有文件夹里面的所有文件,有没有什么较为高效的办法,要求能防止程序卡死!不要一点击程序就出现未响应状态!

//定义代理
delegate void Mydelegate(DirectoryInfo dir, DateTime dtStart, DateTime dtEnd);
delegate void PrintDelegate(FileInfo file);

private void btnSelectDirectory_Click(object sender, EventArgs e)
{
FolderBrowserDialog path = new FolderBrowserDialog();
path.ShowDialog();
if (!"".Equals(path.SelectedPath))
{
tboSelectPath.Text = path.SelectedPath;
}
}

private void btnStartScan_Click(object sender, EventArgs e)
{
DateTime dtStart = dateTimePicker1.Value.Date;
DateTime dtEnd = new DateTime(dateTimePicker2.Value.Year, dateTimePicker2.Value.Month, dateTimePicker2.Value.Day + 1, 0, 0, 0);
DirectoryInfo di = new DirectoryInfo("F:\\bea");
Scan(di, dtStart, dtEnd);
}

private void print(FileInfo file)
{

if (tboFiles.InvokeRequired)
{
PrintDelegate Md = new PrintDelegate(print);
tboFiles.Invoke(Md, file); //
}
else
tboFiles.Text += file.FullName;
}

private void Scan(DirectoryInfo dir, DateTime dtStart, DateTime dtEnd)
{
if (dir.Exists)
{
FileInfo[] files = dir.GetFiles();
if (files.Length > 0)
{

foreach (FileInfo item in files)
{
if (item.LastWriteTime > dtStart && item.LastWriteTime < dtEnd)
{
PrintDelegate Md = new PrintDelegate(print);
//实例一个回调代理
AsyncCallback callback = new AsyncCallback(callbackMethod);
//开始执行异步方法
Md.BeginInvoke(item, callbackMethod, Md);
}
}
}
DirectoryInfo[] dirs = dir.GetDirectories();
if (dirs.Length > 0)
{
foreach (DirectoryInfo item in dirs)
{
Mydelegate Md = new Mydelegate(Scan);
//实例一个回调代理
AsyncCallback callback = new AsyncCallback(callbackMethod);
//开始执行异步方法
Md.BeginInvoke(item, dtStart, dtEnd, callbackMethod, Md);
}
}
}
}//回调方法
static void callbackMethod(IAsyncResult Ias)
{
}

现代码如上,麻烦高手指教!
...全文
467 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
情傷 2012-05-25
  • 打赏
  • 举报
回复
[code=#]
private void btnStartScan_Click(object sender, EventArgs e)
{

DateTime dtStart = dateTimePicker1.Value.Date;
DateTime dtEnd = new DateTime(dateTimePicker2.Value.Year, dateTimePicker2.Value.Month, dateTimePicker2.Value.Day + 1, 0, 0, 0);
DirectoryInfo d = new DirectoryInfo(tboSelectPath.Text.Trim());
//Thread t = new Thread(new ThreadStart(new ScanFile(d, dtStart, dtEnd).Scans));
//t.Start();
Scans(d, dtStart, dtEnd);
}
[/code]
将上面这段注释的部分取消注释,下面一行注释掉之后,扫描出来的文件名无法添加在textbox中,这是为何?
情傷 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

其实你并不用一下子完全扫描出来。因为看的人不会一下子展开全部节点
你可以在展开某个节点的时候扫描该节点下的内容
[/Quote]
3楼的回复是可以考虑,做成树型菜单,一边是结构,一边显示点击的目录中的修改文件,这想法可以!
铛铛 2012-05-25
  • 打赏
  • 举报
回复
其实你并不用一下子完全扫描出来。因为看的人不会一下子展开全部节点
你可以在展开某个节点的时候扫描该节点下的内容
bdmh 2012-05-25
  • 打赏
  • 举报
回复
放到线程中,用委托和UI交互
情傷 2012-05-25
  • 打赏
  • 举报
回复
用多线程弄的如下,

private void btnSelectDirectory_Click(object sender, EventArgs e)
{
FolderBrowserDialog path = new FolderBrowserDialog();
path.ShowDialog();
if (!"".Equals(path.SelectedPath))
{
tboSelectPath.Text = path.SelectedPath;
}
}

private void Form1_Load(object sender, EventArgs e)
{
dateTimePicker2.Value = DateTime.Now;
}

private void btnStartScan_Click(object sender, EventArgs e)
{

DateTime dtStart = dateTimePicker1.Value.Date;
DateTime dtEnd = new DateTime(dateTimePicker2.Value.Year, dateTimePicker2.Value.Month, dateTimePicker2.Value.Day + 1, 0, 0, 0);
DirectoryInfo d = new DirectoryInfo(tboSelectPath.Text.Trim());
//Thread t = new Thread(new ThreadStart(new ScanFile(d, dtStart, dtEnd).Scans));
//t.Start();
Scans(d, dtStart, dtEnd);
}

DirectoryInfo[] dirs; FileInfo[] files;
static int filesCount = 0;
private void Scans(DirectoryInfo dir, DateTime dtStart, DateTime dtEnd)
{
files = dir.GetFiles();
dirs = dir.GetDirectories();
if (files.Length > 0)
{
foreach (FileInfo item in files)
{
filesCount++;
if (dtStart <= item.LastWriteTime && item.LastWriteTime <= dtEnd)
{
Console.WriteLine(item.FullName);
if (tboFiles.InvokeRequired)
{
ScanDelegate s = new ScanDelegate(Scans);
s.Invoke(dir, dtStart, dtEnd);
}
else
tboFiles.Text += "修改时间:" + item.LastWriteTime.ToString() + " " + item.FullName + "\r\n";
}
}
}

if (dirs.Length > 0)
{
foreach (DirectoryInfo item in dirs)
{
//

Thread t = new Thread(new ThreadStart(new ScanFile(item, dtStart, dtEnd).Scans));
t.Start();
}
}
}

public delegate void Scan(DirectoryInfo[] folder, DateTime dtStart, DateTime dtEnd);
public delegate void ScanDelegate(DirectoryInfo dir, DateTime dtStart, DateTime dtEnd);

private void ScanFiles(DirectoryInfo[] folder, DateTime dtStart, DateTime dtEnd)
{
foreach (DirectoryInfo d in folder)
{
if (d.Exists)
{

FileInfo[] files = d.GetFiles();
foreach (FileInfo file in files)
{
if (dtStart <= file.LastWriteTime && file.LastWriteTime <= dtEnd)
{
if (tboFiles.InvokeRequired)
{
Scan setpos = new Scan(ScanFiles);
tboFiles.Invoke(setpos, folder, dtStart, dtEnd); //重新调用SetListBox函数
//setpos.BeginInvoke(ds, dtStart, dtEnd, null, setpos);
}
else
tboFiles.Text += (tboFiles.Text.Trim().Length == 0 ? "" : "\r\n") + "修改时间:" + file.LastWriteTime.ToString() + " " + file.DirectoryName + "\\" + file.Name;
}
}
DirectoryInfo[] ds = d.GetDirectories();
if (ds.Count() > 0)
{
//ScanFiles(ds, dtStart, dtEnd);

//Scan setpos = new Scan(ScanFiles);
//setpos.BeginInvoke(ds, dtStart, dtEnd, null, setpos);
Thread fThread = new Thread(new ThreadStart(new ScanFile(ds, dtStart, dtEnd).Scan));//开辟一个新的线程

fThread.Start();
}
}
}
}

public static void ScanFile(DirectoryInfo[] folder, DateTime dtStart, DateTime dtEnd)
{
ScanFile(folder, dtStart, dtEnd);
}
public static void ScanFile(DirectoryInfo dir, DateTime dtStart, DateTime dtEnd)
{
new Form1().Scans(dir, dtStart, dtEnd);
}
}

public class ScanFile
{
private DirectoryInfo[] dis;
private DirectoryInfo dir;
//private FileInfo[] files;
private DateTime dtStart;
private DateTime dtEnd;
//private StringBuilder sbFiles;
public ScanFile(DirectoryInfo[] dis, DateTime dtStart, DateTime dtEnd)
{
this.dis = dis;
this.dtStart = dtStart;
this.dtEnd = dtEnd;
}
public ScanFile(DirectoryInfo dir, DateTime dtStart, DateTime dtEnd)
{
this.dir = dir;
this.dtStart = dtStart;
this.dtEnd = dtEnd;
}
public void Scan()
{
Form1.ScanFile(this.dis, this.dtStart, this.dtEnd);
}
public void Scans()
{
Form1.ScanFile(dir, dtStart, dtEnd);
}

}

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧