想做一个简单的文件扫描功能,请问怎么实现??
想做一个简单的文件扫描功能,也就是像杀毒软件扫描本地硬盘一样,扫到的文件不断的显示出来,请问高手这个要怎么去实现呢??
我试着用以下程序去实现,但运行时都会卡住几秒,最后只能显示到扫描到的最后一个文件名,郁闷~~~
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace CPic
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnSearch_Click(object sender, EventArgs e)
{
if (MessageBox.Show( "你确定要修改吗? ", "消息框 ", MessageBoxButtons.YesNo)==DialogResult.Yes)
// if(MessageBox.Show((MessageBox.Show( "111 ", "222 ",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Error).ToString())))
{
String myPath = txtPath.Text;
if (myPath == " " || myPath == null)
{
lblMsg.Text = "请输入地址! ";
//MessageBox.Show( "请输入地址! ");
txtPath.Focus();
}else {
FindAllFile(myPath);
}
}
}
public void FindAllFile(string path)
{
DirectoryInfo[] ChildDirectory;//子目录集
FileInfo[] NewFileInfo;//当前所有文件
DirectoryInfo FatherDirectory = new DirectoryInfo(path); //当前目录
ChildDirectory = FatherDirectory.GetDirectories( "*.* "); //得到子目录集
NewFileInfo = FatherDirectory.GetFiles();//得到文件集,可以进行操作
// lblMsg.Text = lblMsg.Text + "\n+ " + FatherDirectory.Name + "/ ";
foreach (FileInfo fi in NewFileInfo)
{
//lblMsg.Text = lblMsg.Text + "\n " + fi.Name;
lblMsg.Text = fi.Name;
}
foreach (DirectoryInfo dirInfo in ChildDirectory)
{
FindAllFile(dirInfo.FullName);
}
}
}
}
[解决办法]
1.利用线程.
private void btnSearch_Click(object sender, EventArgs e)
{
if (MessageBox.Show( "你确定要修改吗? ", "消息框 ", MessageBoxButtons.YesNo)==DialogResult.Yes)
// if(MessageBox.Show((MessageBox.Show( "111 ", "222 ",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Error).ToString())))
{
String myPath = txtPath.Text;
if (myPath == " " || myPath == null)
{
lblMsg.Text = "请输入地址! ";
//MessageBox.Show( "请输入地址! ");
txtPath.Focus();
}else {
Thread thread = new Thread(new ThreadStart(FindFileStart));
thread.Start();
}
}
}
FindFileStart()
{
FindAllFile(txtPath.Text);
}
2.显示的时候应该这样
lblMsg.Text += fi.Name;
[解决办法]
这样的长时间的操作应该在另外一个线程里实现,而不是在窗体线程中实现,否则会造成窗体界面线程阻塞无法更新界面上的内容。
具体实现方面,请参考:
1 委托的知识:http://msdn2.microsoft.com/zh-cn/library/ms173171(VS.80).aspx
2 线程处理基础:http://msdn2.microsoft.com/zh-cn/library/ms173178(VS.80).aspx
3 C#的线程实例:http://msdn2.microsoft.com/zh-cn/library/w1w6424a(VS.80).aspx
有问题可以再联系我MSN: r_gouki@msn.com
------解决方案--------------------
在线程中操作空间要使用委托