当前位置:编程学习 > C#/ASP.NET >>

新人第1贴---清理ASP.NET上传文件夹中未使用附件的方法

本人新手哈,请多批评指教
学习C#4个月了
最近用ASP.net开发了一个知识库系统
网站允许下属部门发起业务求助.其中涉及上传附件功能.由于个人上传操作问题及知识库条目删除后,在网站的上传文件夹中往往会有很多附件变成了垃圾附件.就设计一个清理功能.代码如下:
实现原理:
1.查找到文件夹中的所有包含路径信息的文件名(Directory.GetFiles(path),Directory.GetDirectories(path))
2.得到所有引用了文件名的数据库字段值(集合)
3.取得文件夹(含子文件夹)中的文件名(Path.GetFileName(path))
4.查找数据库字段中是否匹配有文件夹中的文件名(数据库字段值.IndexOf(localFile))
5.如果没有匹配项,则删除文件(FileInfo fi = new FileInfo(item),fi.Delete());

步骤:
1.定义查找文件夹中所有文件的方法(protected List<string> GetFilePath(string path));
2.定义匹配本地文件与数据库字段文件的方法(protected bool FindUsedFile(string localFile,List<string> dataBaseFile))
3.定义清理方法(protected int ClearNotUsedFile(string path,List<string> dataBaseFile)),清理方法中调用1和2中的方法进行清理.并返回清理条数.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace updataTest
{
    public partial class dellFile : System.Web.UI.Page
    {
        List<Model.testud> modelist = new List<Model.testud>();
        BLL.testupdataBll testBll = new BLL.testupdataBll();
        protected void Page_Load(object sender, EventArgs e)
        {
            

        }
        /// <summary>
        /// 获取文件夹中所有文件名(含路径)
        /// </summary>
        /// <param name="path">要传入的文件路径名</param>      
        protected List<string> GetFilePath(string path)
        {
            List<string> filePathList = new List<string>();//声明一个路径列表集合
            string[] dirs = Directory.GetDirectories(path);//1.根据文件路径得到该路径下的所有文件夹集合
            if (dirs.Length > 0)//存在子文件夹
            {
                foreach (string item in dirs)//2.遍历文件夹集合,得到所有文件夹名(含全路径)
                {//Path.GetFileName(item);//取出不含路径的文件名方法
                    string[] files = Directory.GetFiles(item);//3.得到该子文件夹下的所有文件集合(含路径)
                    if (files.Length > 0)
                    {
                        foreach (string file in files)//4.遍历该文件集合,得到该其下所有文件(含路径)
                        {
                            filePathList.Add(file);//将含全路径的文件名加入到集合中.
                            //Response.Write(item + "</br>");                          
                        }
                    }

                }

            }
            return filePathList;//5.返回文件列表(含路径)
        }
        /// <summary>
        /// 查找已使用的文件
        /// </summary>
        /// <param name="localFile">本地文件名</param>
        /// <param name="dataBaseFile">数据库中存在的文件名</param>
        /// <returns></returns>
        protected bool FindUsedFile(string localFile,List<string> dataBaseFile)
        {
            foreach (var item in dataBaseFile)//遍历数据库中查出的文件名(一般为某一字段列中所有的数据)
            {
                if (item.IndexOf(localFile)>=0)//将本地文件夹名和数据库中的文件进行查找,数据库中有该文件名存在则返回true
                {
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 清理未使用的文件
        /// </summary>
        /// <param name="path">文件所在路径</param>
        /// <param name="dataBaseFile">数据库中存在的文件名列表</param>
        /// <returns>int</returns>
        protected int ClearNotUsedFile(string path,List<string> dataBaseFile)
        {
            List<string> localFilePathList = this.GetFilePath(path);//调用"获取文件夹中所有文件名(含路径)"方法,获得含路径的本地文件名列表
            string localFileName;//声明本地文件名变量
            int n = 0;//声明计数变量,记录删除的文件数.
            foreach (var item in localFilePathList)//遍历文件名列表,得到每一个文件名.
            {
                localFileName = Path.GetFileName(item); //取得不含路径的文件名  
                if (!this.FindUsedFile(localFileName, dataBaseFile))//调用"查找已使用文件"方法,不等于true则表示未找到
                {
                    FileInfo fi = new FileInfo(item);//如果找到未使用文件,则删除之
                    fi.Delete();
                    n += 1;
                }
            }
            return n; 
        }

        protected void clearFiles_Click(object sender, EventArgs e)//点击按钮,清除文件
        {
            string filePath =Page.Server.MapPath("upload/");//得到文件夹绝对路径
            modelist = testBll.GetMsg();//得到数据库中的数据集合
            List<string> dataBaseFile = new List<string>();//声明一个string集合,存放查到的数据库字段内容集合(此字段包含对上传文件的引用)
            foreach (var item in modelist)//遍历数据集合
            {
                dataBaseFile.Add(item.Msg);//取出含文件引用的字段内容,增加到集合中
            }
            int num = this.ClearNotUsedFile(filePath, dataBaseFile);//传入文件夹路径和数据字段集合,进行对比清理.
            if (num > 0)
            {
                Label1.Text = "共清理未使用文件" + num + "个";
            }
            else
            {
                Label1.Text = "不存在未使用文件";
            }
        }
    }
}
--------------------编程问答-------------------- 嗯?你想咨询什么?你思路是对的。 --------------------编程问答--------------------
引用 1 楼 mayee 的回复:
嗯?你想咨询什么?你思路是对的。

谢谢哈.
我也不知道怎么就发成了求助贴
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,