首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

想做一个简单的文件扫描功能,请教如何实现?

2012-02-01 
想做一个简单的文件扫描功能,请问怎么实现??想做一个简单的文件扫描功能,也就是像杀毒软件扫描本地硬盘一

想做一个简单的文件扫描功能,请问怎么实现??
想做一个简单的文件扫描功能,也就是像杀毒软件扫描本地硬盘一样,扫到的文件不断的显示出来,请问高手这个要怎么去实现呢??

我试着用以下程序去实现,但运行时都会卡住几秒,最后只能显示到扫描到的最后一个文件名,郁闷~~~

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
------解决方案--------------------


在线程中操作空间要使用委托

热点排行