定时清除项目中不需要的图片
开发工具与关键技术:Visual Studio 2015 定时任务
作者:孙水兵
撰写时间:2019年7月7
一、 达到的效果
将项目中因为发生异常或者其他原因而导致图片未能从临时目录转入最终目录的所有图片定时清除。或者将项目的最终目录存在而数据中没有相对应的路径的图片定时清除。
二、 前期准备
添加定时任务的引用:在添加引用时添加FluentScheduler.dll文件(在我的博客中:定时插件FluentScheduler的使用 中有详细说明)。
三、 删除临时目录中所有图片
在添加的工作类中获取项目的运行目录,利用AppDomain.CurrentDomain.BaseDirectory +Document\BusinessManagement\Temp来获取项目中临时目录的绝对路径。其中AppDomain.CurrentDomain是用来获取项目所在的绝对路径,然后在拼接上临时目录在项目中的路径,由此,就获得了项目中临时目录的绝对路径。然后判断是否存在该路径。如果不存在存在该路径,就创建一个路径。若是存在该路径,继续往下执行。然后利用方法GetDirectories来获取临时目录中的所有目录。然后foreach循环获取到的子目录。然后删除子目录。再获取到临时目录中的子文件夹,然后删除。
四、 删除最终目录存在而数据库中没有相对应的路径的图片
思路:获取到最终目录中所有图片的路径和查出数据库中所有图片的路径,然后获取到所有图片的名称。将获取到最终目录中所有图片的名称等于从数据库中查出所有图片的名称的图片名称从将获取到最终目录中所有图片的名称列表中删除。
第一步:在工作类中实例化Models
在删除临时目录的下面写删除最终目录存在而数据库中没有相对应的路径的图片的代码。
第二步:获取最终目录中的所有图片的名称和路径并且new一些用来接收的集合
和删除临时目录一样,先获取到最终目录的绝对路径。然后根据GetFiles获取到绝对路径下面的所有文件的名称(包括路径)并将其放入string[] 类型的变量fileDriverPic中。然后new两个string类型的集合,分别为 listPicName、listPicNameMuLu。listPicName是用来放入从数据库中查出的所有图片的名称,listPicNameMuLu是用来放入最终目录中的所有图片的名称。
第三步:从数据库中查出所有的图片路径。然后对比,删除。
从数据库中查询出所有的图片的路径,并用变量listDrivrPicSrc来接收。然后foreach循环listDrivrPicSrc。因为从数据库中查询出来的是图片路径,需要将路径中图片的名称提取出来。(从数据库中获取到的图片的路径:"/Document/BusinessManagement/Driverimg/7HE3f刀光剑影.PNG")。因此用到了方法Substring()。然后将图片名称放入listPicName中。从项目中的最终路径中获取到的图片路径也是如此处理。处理完之后将图片名称放入listPicNameMuLu中。
然后foreach循环处理完之后的从数据库中获取到的图片名称的集合listPicName。然后在最终目录中的所有图片的名称的集合listPicNameMuLu中移除listPicName中存在的。这样就将最终目录中多余的图片的名称获取到了。然后foreach这些名称,拼接然路径,然后删除。
定时调用:(在我的博客中:定时插件FluentScheduler的使用 中详细说明)
全部代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FluentScheduler;
using System.IO;
using TransportManagment.Models;
namespace TransportManagment.Timer
{
public class RemoveDriverPict : IJob
{
Models.TransportManagmentEntities myModels = new TransportManagmentEntities();
public void Execute()
{
//删除临时目录中所有图片
//获取项目运行目录+Document\BusinessManagement\Temp来获取临时目录的绝对路径
string str = AppDomain.CurrentDomain.BaseDirectory + "Document\\BusinessManagement\\Temp";
try
{
if (Directory.Exists(str))
{
//存在Temp目录,就删除所有的子目录和子文件夹
//删除子文件夹
string[] directory = Directory.GetDirectories(str);
foreach (string item in directory)
{
Directory.Delete(item, true);
}
//删除子文夹
string[] files = Directory.GetFiles(str);
foreach (string file in files)
{
System.IO.File.Delete(file);
}
}
else
{
//不存在,就创建目录
Directory.CreateDirectory(str);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
//删除驾驶员图片中重复的图片
//获取项目运行目录+Document\BusinessManagement\Driverimg
string strPic = AppDomain.CurrentDomain.BaseDirectory + "Document\\BusinessManagement\\Driverimg";
string[] fileDriverPic = Directory.GetFiles(strPic);
List<string> listPicName = new List<string>();
List<string> listPicNameMulu = new List<string>();
var listDrivrPicSrc = (from tbDriver in myModels.SYS_Driver
select tbDriver.DriverPicture).ToList();
foreach (string item in listDrivrPicSrc)
{
string picName = item.Substring(39);
listPicName.Add(picName);
}
foreach (string item in fileDriverPic)
{
string picName = item.Substring(116);
listPicNameMulu.Add(picName);
}
foreach (string item in listPicName)
{
listPicNameMulu.Remove(item);
}
foreach (string item in listPicNameMulu)
{
string RemovePic = "F:\\NET\\mvc\\MVC\\MVC练习\\客运站售票系统\\项目:客运站售票系统\\TransportManagment\\TransportManagment\\Document\\BusinessManagement\\Driverimg\\" + item;
System.IO.File.Delete(RemovePic);
}
}
}
}
推荐阅读