新人第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 = "不存在未使用文件";
}
}
}
}
谢谢哈.
我也不知道怎么就发成了求助贴
补充:.NET技术 , ASP.NET