使用C#递归删除一个文件夹

删除文件夹有时候并不是一件容易的事,特别是类似于boost解压出来的文件夹,其中的目录和文件太多,删除的时候,光弹出确认界面就要等好久好久。

最理想的情况是,我选中这个目录后,马上可以开始删除,然后我就可以站起来出去喝口水,或者去吃个饭,回来时世界已经清静了。

当然了,现在win7删除一个大目录时,速度已经相当快了,再加上电脑速度越来越快。自己写代码这种事纯粹是个人爱好,不见得速度比windows的删除速度快,本文只是记录一下这个想法的实际做法,免得需要的时候又琢磨半天。


自己创建一个窗口,用来接收选择目录等等操作,new 一个 DeleteRunner出来,然后把目录的路径传给其Delete函数即可。

class DeleteRunner
{
    private string m_strRoot;
    private int longDirNum = 0;

    public DeleteRunner()
    {
    }

    public void Delete(string strPath) //对外接口
    {
        m_strRoot = strPath;

        _delete(strPath);
    }

    private void _delete(string strFolder)
    {
        //删除长路径, 把目录移动到根目录下再删除, 防止删除时的windows错误提示
        if (strFolder.Length >= 160) 
        {
            int pos = strFolder.LastIndexOf("\\");
            if (pos == -1)
            {
                return;
            }

            ++longDirNum;
            string strDestDir = m_strRoot + "\\" + longDirNum;

            Directory.Move(strFolder, strDestDir);
                
            _delete(strDestDir);

            return;
        }

        //删除目录下的所有文件
        string[] listFiles = Directory.GetFiles(strFolder);
        if (listFiles.Length > 0)
        {
            for (int index = 0; index < listFiles.Length; ++index)
            {
                FileInfo fi = new FileInfo(listFiles[index]);
                fi.Attributes = FileAttributes.Normal; //防止有只读文件无法删除

                File.Delete(listFiles[index]);
            }
        }

        //删除此目录下的所有目录,即递归向下删
        string[] listFolders = Directory.GetDirectories(strFolder);
        if (listFolders.Length > 0)
        {
            for (int index = 0; index < listFolders.Length; ++index)
            {
                _delete(listFolders[index]);
            }
        }

        //最后删除当前目录
        Directory.Delete(strFolder);
    }
}
美中不足的时,这样删除时,还是会遇到一些问题,比如“目录不是空的”等等这些提示,不过小问题就不管了。




你可能感兴趣的:(C#经验)