C# 本地图片缓存器ImageFileCache (www.csframework.com)
C# 本地图片缓存器ImageFileCache (www.csframework.com)
C# Code:
/// <summary>
/// C# 本地图片缓存器(www.csframework.com)
/// </summary>
public class ImageFileCache
{
//考虑异步应用,加锁
private object _Locker = new object();
//图片根目录
private string _baseFolder = "";
//图片数据库
private DataTable _Data;
/// <summary>
/// 构造器
/// </summary>
public ImageFileCache(string baseFolder = "")
{
//默认为应用程序目录下
if (String.IsNullOrWhiteSpace(baseFolder))
baseFolder = Path.Combine(Application.StartupPath, "ImageCache");
_baseFolder = baseFolder;
if (!Directory.Exists(baseFolder))
Directory.CreateDirectory(baseFolder);
//加载数据库
_Data = ReadDatabase();
}
#region Instance
static ImageFileCache _Instance = null;
public static ImageFileCache Instance
{
get
{
if (_Instance == null) _Instance = new ImageFileCache();
return _Instance;
}
}
#endregion;
internal bool Exists(ImageBuckleName buckle, string url)
{
url = ToMD5(url);
lock (_Locker)
{
return _Data.Select($"buckle='{buckle.ToString()}' AND url='{url}'").Length > 0;
}
}
/// <summary>
/// 数据库文件路径
/// </summary>
private string dbFile { get { return Path.Combine(_baseFolder, "cache_files.db"); } }
/// <summary>
/// 加载数据库
/// </summary>
/// <returns></returns>
private DataTable ReadDatabase()
{
lock (_Locker)
{
string path = this.dbFile;
if (File.Exists(path))
{
_Data = GetFileTable();
_Data.ReadXml(path);
return _Data;
}
else
{
_Data = GetFileTable();
return _Data;
}
}
}
/// <summary>
/// 保存数据库
/// </summary>
public void Save()
{
lock (_Locker)
{
_Data.WriteXml(this.dbFile, true);
}
}
/// <summary>
/// 获取图片
/// </summary>
/// <param name="buckle"></param>
/// <param name="url"></param>
/// <returns></returns>
public Bitmap GetImage(ImageBuckleName buckle, string url)
{
url = ToMD5(url);
lock (_Locker)
{
var rows = _Data.Select($"buckle='{buckle.ToString()}' AND url='{url}'");
if (rows.Length > 0)
{
string file = Path.Combine(_baseFolder, rows[0]["name"].ToString());
//C#加载图片文件,不占用文件句柄方式。
byte[] bs = File.ReadAllBytes(file);
MemoryStream ms = new MemoryStream(bs);
return new Bitmap(Image.FromStream(ms));
}
else
{
return null;
}
}
}
/// <summary>
/// 添加图片
/// </summary>
/// <param name="url"></param>
/// <param name="img"></param>
/// <param name="buckle"></param>
public void AddImage(string url, Image img, ImageBuckleName buckle)
{
lock (_Locker)
{
string md5 = ToMD5(url);
string dir = Path.Combine(_baseFolder, buckle.ToString());
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
string ext = Path.GetExtension(url);
string fileName = md5 + ext;
fileName = buckle.ToString() + @"\" + fileName;
string file = Path.Combine(_baseFolder, fileName);
img.Save(file);
if (File.Exists(file))
{
DataRow row = _Data.Rows.Add();
row["buckle"] = buckle.ToString();
row["name"] = fileName;
row["url"] = md5;//将url转化为md5
row["time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
_Data.AcceptChanges();
}
}
}
private DataTable GetFileTable()
{
DataTable dt = new DataTable("file");
dt.Columns.Add("isid", typeof(int));
dt.Columns.Add("buckle", typeof(String));
dt.Columns.Add("url", typeof(String));
dt.Columns.Add("name", typeof(String));
dt.Columns.Add("time", typeof(String));
return dt;
}
/// <summary>
/// MD5加密,不可逆
/// </summary>
/// <param name="clearText">明文字符串</param>
/// <returns></returns>
private string ToMD5(string clearText)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] encryptedBytes = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(clearText));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < encryptedBytes.Length; i++)
{
sb.AppendFormat("{0:x2}", encryptedBytes[i]);
}
return sb.ToString().ToLower();
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// C# 本地图片缓存器(www.csframework.com)
/// </summary>
public class ImageFileCache
{
//考虑异步应用,加锁
private object _Locker = new object();
//图片根目录
private string _baseFolder = "";
//图片数据库
private DataTable _Data;
/// <summary>
/// 构造器
/// </summary>
public ImageFileCache(string baseFolder = "")
{
//默认为应用程序目录下
if (String.IsNullOrWhiteSpace(baseFolder))
baseFolder = Path.Combine(Application.StartupPath, "ImageCache");
_baseFolder = baseFolder;
if (!Directory.Exists(baseFolder))
Directory.CreateDirectory(baseFolder);
//加载数据库
_Data = ReadDatabase();
}
#region Instance
static ImageFileCache _Instance = null;
public static ImageFileCache Instance
{
get
{
if (_Instance == null) _Instance = new ImageFileCache();
return _Instance;
}
}
#endregion;
internal bool Exists(ImageBuckleName buckle, string url)
{
url = ToMD5(url);
lock (_Locker)
{
return _Data.Select($"buckle='{buckle.ToString()}' AND url='{url}'").Length > 0;
}
}
/// <summary>
/// 数据库文件路径
/// </summary>
private string dbFile { get { return Path.Combine(_baseFolder, "cache_files.db"); } }
/// <summary>
/// 加载数据库
/// </summary>
/// <returns></returns>
private DataTable ReadDatabase()
{
lock (_Locker)
{
string path = this.dbFile;
if (File.Exists(path))
{
_Data = GetFileTable();
_Data.ReadXml(path);
return _Data;
}
else
{
_Data = GetFileTable();
return _Data;
}
}
}
/// <summary>
/// 保存数据库
/// </summary>
public void Save()
{
lock (_Locker)
{
_Data.WriteXml(this.dbFile, true);
}
}
/// <summary>
/// 获取图片
/// </summary>
/// <param name="buckle"></param>
/// <param name="url"></param>
/// <returns></returns>
public Bitmap GetImage(ImageBuckleName buckle, string url)
{
url = ToMD5(url);
lock (_Locker)
{
var rows = _Data.Select($"buckle='{buckle.ToString()}' AND url='{url}'");
if (rows.Length > 0)
{
string file = Path.Combine(_baseFolder, rows[0]["name"].ToString());
//C#加载图片文件,不占用文件句柄方式。
byte[] bs = File.ReadAllBytes(file);
MemoryStream ms = new MemoryStream(bs);
return new Bitmap(Image.FromStream(ms));
}
else
{
return null;
}
}
}
/// <summary>
/// 添加图片
/// </summary>
/// <param name="url"></param>
/// <param name="img"></param>
/// <param name="buckle"></param>
public void AddImage(string url, Image img, ImageBuckleName buckle)
{
lock (_Locker)
{
string md5 = ToMD5(url);
string dir = Path.Combine(_baseFolder, buckle.ToString());
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
string ext = Path.GetExtension(url);
string fileName = md5 + ext;
fileName = buckle.ToString() + @"\" + fileName;
string file = Path.Combine(_baseFolder, fileName);
img.Save(file);
if (File.Exists(file))
{
DataRow row = _Data.Rows.Add();
row["buckle"] = buckle.ToString();
row["name"] = fileName;
row["url"] = md5;//将url转化为md5
row["time"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
_Data.AcceptChanges();
}
}
}
private DataTable GetFileTable()
{
DataTable dt = new DataTable("file");
dt.Columns.Add("isid", typeof(int));
dt.Columns.Add("buckle", typeof(String));
dt.Columns.Add("url", typeof(String));
dt.Columns.Add("name", typeof(String));
dt.Columns.Add("time", typeof(String));
return dt;
}
/// <summary>
/// MD5加密,不可逆
/// </summary>
/// <param name="clearText">明文字符串</param>
/// <returns></returns>
private string ToMD5(string clearText)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] encryptedBytes = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(clearText));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < encryptedBytes.Length; i++)
{
sb.AppendFormat("{0:x2}", encryptedBytes[i]);
}
return sb.ToString().ToLower();
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
C# Code:
/// <summary>
/// 图片存储子目录(可自定义)
/// </summary>
public enum ImageBuckleName
{
large_images,
small_images
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// <summary>
/// 图片存储子目录(可自定义)
/// </summary>
public enum ImageBuckleName
{
large_images,
small_images
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
缓存图片文件目录结构,以及图片数据库文件:


参考文档:
原创:C#源码 GridMovetor按回车自动跳到下一列或自动新增记录(www.csframework.com)
C/S架构快速开发框架SQL并发测试压力测试 | www.csframework.com
阿里云ECS服务器上IIS部署多个Web网站详解|www.CSframework.com
C/S系统快速开发框架核心竞争力报告|www.CSFramework.com
众里寻她千百度,蓦然回首,C/S框架就在www.csframework.com...
CS开发框架版本介绍(www.csframework.com)
C# Dev GridView表格的CustomUnboundColumnData事件异步加载图片类AsynDownImage
详解DevExpress.LookUpEdit控件实现自动搜索定位功能|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)
C/S架构软件开发平台 | 旗舰版V6.0 | 自动创建数据库备份计划|C/S开发框架
CSFrameworkV6.1前端+WebApiV3后端测试报告(前后端分离)|C/S开发框架
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
CSFrameworkV6旗舰版|新建业务模块 (VS Project项目)|C/S开发框架
C/S架构软件开发平台 | 旗舰版V6 主页|C/S开发框架
C/S架构软件开发平台 | 旗舰版V6.0 | 自动备份数据库计划|C/S开发框架
原创:C#源码 GridMovetor按回车自动跳到下一列或自动新增记录(www.csframework.com)
C/S架构快速开发框架SQL并发测试压力测试 | www.csframework.com
阿里云ECS服务器上IIS部署多个Web网站详解|www.CSframework.com
C/S系统快速开发框架核心竞争力报告|www.CSFramework.com
众里寻她千百度,蓦然回首,C/S框架就在www.csframework.com...
CS开发框架版本介绍(www.csframework.com)
C# Dev GridView表格的CustomUnboundColumnData事件异步加载图片类AsynDownImage
详解DevExpress.LookUpEdit控件实现自动搜索定位功能|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)|C/S开发框架
C# Winform等待窗体WaitingForm组件下载(CSFramework提供)
C/S架构软件开发平台 | 旗舰版V6.0 | 自动创建数据库备份计划|C/S开发框架
CSFrameworkV6.1前端+WebApiV3后端测试报告(前后端分离)|C/S开发框架
企业级C/S系统快速开发框架(Winform+.NET8+EFCore)|C/S开发框架
CSFrameworkV6旗舰版|新建业务模块 (VS Project项目)|C/S开发框架
C/S架构软件开发平台 | 旗舰版V6 主页|C/S开发框架
C/S架构软件开发平台 | 旗舰版V6.0 | 自动备份数据库计划|C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
