
本文介绍一个我的同事【懒得勤快】(人称勤快哥,我们叫他骚哥)写的一个.NET 开源工具类库项目,包含一些常用的操作类,大都是静态类,加密解密,反射操作,硬件信息,字符串扩展方法,日期时间扩展操作,大文件拷贝,图像裁剪,验证码等常用封装。
这是我的同事【懒得勤快】从入坑编程多年来的代码积累,他把一些编程中常用的一些代码进行了封装,在后续的任何开发当中使用上它,避免重复地去造一些轮子,把重心转移到项目的推进,几乎可以做任何的事情。
他说现在项目中没了它,写逻辑代码还真有点困难。由于 C#语言有个其他语言不可替代的特性:扩展方法,所以项目的实现 90%以上都是通过扩展方法实现的,方便直接调用。
因此,我们可以看出,虽然他的网名叫【懒得勤快】,实际上,他比大多数人都勤快的多。另外,我司.NET Core 项目中的核心工具类库也主要是引用了众多这个类库中的通用方法,很多骚操作都是从这个项目中直接复用的。
项目包含了日常编程多数的常用封装,可以说是一个万能框架,能够用于任何基于.NET 平台(包括.NET Core)的项目当中。
功能主要覆盖:
数据库操作:内存表操作、关系实体映射等;
日期时间常用操作:农历操作、时间戳操作,时分秒转换等;
文件操作:大文件操作、文件压缩与解压、ini 配置文件操作;
硬件操作:获取电脑各个硬件的性能指标;
Html 操作:利用 C#对 html 字符串进行“dom”操作,html 的 XSS 净化、html 标签操作;
日志组件:高并发可用的高性能日志记录;
多媒体文件操作:图片的各种处理;
网络操作:获取线程内唯一对象、Session 和 Cookie 的扩展、获取 IP 地址详细信息、缓存操作;
NoSQL:仅封装了 Redis 的常用操作,mongodb 的操作类客户端独立分开了;
反射操作:各种对对象的字段属性和方法的快捷方式;
加密安全:对字符串进行的扩展,包含 AES、DES、MD5、hash、SHA1、加盐等;
字符串扩展:包含验证码生成、各种与字符串相关的扩展;
Win32API:包含于 Windows 系统接口相关的操作封装;
全局扩展:包含字符串扩展,类型转换,委托、循环操作、异步操作、正则等。
项目源代码托管于 github,程序包发布于 nuget,目前已有745 个 star以及30000 余次下载,由此也可以说明大伙也挺喜欢这个工具组件的。
github 地址(这里仅展示我司的开源社区仓库地址,他的个人仓库中的这个项目 star 数目有 745 个):https://github.com/XiLife-OSPC/Masuit.Tools
值得一提的是,这个项目加入了反 996 的许可,即任何性质的外包公司
或996 公司
需要使用本类库,请联系作者进行商业授权!其他企业或个人可随意使用不受限。
.NET Framework ≥4.6.1
PM> Install-Package Masuit.Tools.Net
.NET Core 3.x
PM> Install-Package Masuit.Tools.Core
1、检验字符串是否是 Email、手机号、URL、IP 地址、身份证号
bool isEmail="3444764617@qq.com".MatchEmail();
bool isInetAddress = "114.114.114.114".MatchInetAddress();
bool isUrl = "http://masuit.com".MatchUrl();
bool isPhoneNumber = "15205201520".MatchPhoneNumber();
bool isIdentifyCard = "312000199502230660".MatchIdentifyCard();// 校验中国大陆身份证号
2、硬件检测(仅支持 Windows 平台)
float load = SystemInfo.CpuLoad;// 获取 CPU 占用率
long physicalMemory = SystemInfo.PhysicalMemory;// 获取物理内存总数
long memoryAvailable = SystemInfo.MemoryAvailable;// 获取物理内存可用率
double freePhysicalMemory = SystemInfo.GetFreePhysicalMemory();// 获取可用物理内存
Dictionary<string, string> diskFree = SystemInfo.DiskFree();// 获取磁盘每个分区可用空间
Dictionary<string, string> diskTotalSpace = SystemInfo.DiskTotalSpace();// 获取磁盘每个分区总大小
Dictionary<string, double> diskUsage = SystemInfo.DiskUsage();// 获取磁盘每个分区使用率
double temperature = SystemInfo.GetCPUTemperature();// 获取 CPU 温度
int cpuCount = SystemInfo.GetCpuCount();// 获取 CPU 核心数
IList<string> ipAddress = SystemInfo.GetIPAddress();// 获取本机所有 IP 地址
string localUsedIp = SystemInfo.GetLocalUsedIP();// 获取本机当前正在使用的 IP 地址
IList<string> macAddress = SystemInfo.GetMacAddress();// 获取本机所有网卡 mac 地址
string osVersion = SystemInfo.GetOsVersion();// 获取操作系统版本
RamInfo ramInfo = SystemInfo.GetRamInfo();// 获取内存信息
3、大文件操作
FileStream fs = new FileStream(@"D:boot.vmdk", FileMode.OpenOrCreate, FileAccess.ReadWrite);
{
//fs.CopyToFile(@"D:1.bak");//同步复制大文件
fs.CopyToFileAsync(@"D:1.bak");//异步复制大文件
string md5 = fs.GetFileMD5Async().Result;//异步获取文件的 MD5
}
4、HTML 的防 XSS 处理
string html = @"<link href='/Content/font-awesome/css' rel='stylesheet'/>
<!--[if IE 7]>
<link href='/Content/font-awesome-ie7.min.css' rel='stylesheet'/>
<![endif]-->
<script src='/Scripts/modernizr'></script>
<div id='searchBox' role='search'>
<form action='/packages' method='get'>
<span class='user-actions'><a href='/users/account/LogOff'>退出</a></span>
<input name='q' id='searchBoxInput'/>
<input id='searchBoxSubmit' type='submit' value='Submit' />
</form>
</div>";
string s = html.HtmlSantinizerStandard();//清理后:<div><span><a href="/users/account/LogOff">退出</a></span></div>
5、整理操作系统内存(仅支持 Windows)
Windows.ClearMemorySilent();
6、任意禁止转换
NumberFormater nf = new NumberFormater(36);//内置 2-62 进制的转换
//NumberFormater nf = new NumberFormater("0123456789abcdefghijklmnopqrstuvwxyz");// 自定义进制字符,可用于生成验证码
string s36 = nf.ToString(12345678);
long num = nf.FromString("7clzi");
Console.WriteLine("12345678 的 36 进制是:" + s36); // 7clzi
Console.WriteLine("36 进制的 7clzi 是:" + num); // 12345678
var bin=12345678.ToBinary(36);//7clzi
7、纳秒级性能计数器
HiPerfTimer timer = HiPerfTimer.StartNew();
for (int i = 0; i < 100000; i++)
{
//todo
}
timer.Stop();
Console.WriteLine("执行 for 循环 100000 次耗时"+timer.Duration+"s");
double time = HiPerfTimer.Execute(() =>
{
for (int i = 0; i < 100000; i++)
{
//todo
}
});
Console.WriteLine("执行 for 循环 100000 次耗时"+time+"s");
8、单机产生唯一有序的短 ID
var token=Stopwatch.GetTimestamp().ToBinary(36);
var set = new HashSet<string>();
double time = HiPerfTimer.Execute(() =>
{
for (int i = 0; i < 1000000; i++)
{
set.Add(Stopwatch.GetTimestamp().ToBinary(36));
}
});
Console.WriteLine(set.Count==1000000);//True
Console.WriteLine("产生 100w 个 id 耗时"+time+"s");//1.6639039s
9、产生分布式唯一有序的短 ID
var sf = SnowFlake.GetInstance();
string token = sf.GetUniqueId();// rcofqodori0w
string shortId = sf.GetUniqueShortId(8);// qodw9728
var set = new HashSet<string>();
double time = HiPerfTimer.Execute(() =>
{
for (int i = 0; i < 1000000; i++)
{
set.Add(SnowFlake.GetInstance().GetUniqueId());
}
});
Console.WriteLine(set.Count == 1000000); //True
Console.WriteLine("产生 100w 个 id 耗时" + time + "s"); //2.6891495s
10、农历转换
ChineseCalendar.CustomHolidays.Add(DateTime.Parse("2018-12-31"),"元旦节");//自定义节假日
ChineseCalendar today = new ChineseCalendar(DateTime.Parse("2018-12-31"));
Console.WriteLine(today.ChineseDateString);// 二零一八年十一月廿五
Console.WriteLine(today.AnimalString);// 生肖:狗
Console.WriteLine(today.GanZhiDateString);// 干支:戊戌年甲子月丁酉日
Console.WriteLine(today.DateHoliday);// 获取按公历计算的节假日
...
11、LINQ 表达式树扩展
Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
Expression<Func<string, bool>> where2 = s => s.Length > 10;
Func<string, bool> func = where1.And(where2).Compile();
bool b=func("abcd12345678");//true
Expression<Func<string, bool>> where1 = s => s.StartsWith("a");
Expression<Func<string, bool>> where2 = s => s.Length > 10;
Func<string, bool> func = where1.Or(where2).Compile();
bool b=func("abc");// true
12、模板引擎
var tmp = new Template("{{name}},你好!");
tmp.Set("name", "万金油");
string s = tmp.Render();//万金油,你好!
var tmp = new Template("{{one}},{{two}},{{three}}");
string s = tmp.Set("one", "1").Set("two", "2").Set("three", "3").Render();// 1,2,3
var tmp = new Template("{{name}},{{greet}}!");
tmp.Set("name", "万金油");
string s = tmp.Render();// throw 模版变量{{greet}}未被使用
13、List 转 DataTable
var list = new List<MyClass>()
{
new MyClass()
{
Name = "张三",
Age = 22
},
new MyClass()
{
Name = "李四",
Age = 21
},
new MyClass()
{
Name = "王五",
Age = 28
}
};
var table = list.Select(c => new{姓名=c.Name,年龄=c.Age}).ToList().ToDataTable();// 将自动填充列姓名和年龄
14、文件压缩与解压
基于.NET Framework
MemoryStream ms = SevenZipCompressor.ZipStream(new List<string>()
{
@"D:1.txt",
"http://ww3.sinaimg.cn/large/87c01ec7gy1fsq6rywto2j20je0d3td0.jpg",
});//压缩成内存流
SevenZipCompressor.Zip(new List<string>()
{
@"D:1.txt",
"http://ww3.sinaimg.cn/large/87c01ec7gy1fsq6rywto2j20je0d3td0.jpg",
}, zip);//压缩成 zip
SevenZipCompressor.UnRar(@"D:Downloadtest.rar", @"D:Download");//解压 rar
SevenZipCompressor.Decompress(@"D:Downloadtest.tar", @"D:Download");//自动识别解压压缩包
SevenZipCompressor.Decompress(@"D:Downloadtest.7z", @"D:Download");
基于.NET Core
首先是注入
services.AddSevenZipCompressor(); // Startup.cs中注入Compressor
// 构造函数注入
private readonly ISevenZipCompressor _sevenZipCompressor;
public Test(ISevenZipCompressor sevenZipCompressor)
{
_sevenZipCompressor = sevenZipCompressor;
}
其次使用方式同.NET Framework 版
15、FTP 客户端
FtpClient ftpClient = FtpClient.GetAnonymousClient("192.168.2.2");//创建一个匿名访问的客户端
//FtpClient ftpClient = FtpClient.GetClient("192.168.2.3","admin","123456");// 创建一个带用户名密码的客户端
ftpClient.Delete("/1.txt");// 删除文件
ftpClient.Download("/test/2.txt","D:\test\2.txt");// 下载文件
ftpClient.UploadFile("/test/22.txt","D:\test\22.txt",(sum, progress) =>
{
Console.WriteLine("已上传:"+progress*1.0/sum);
});//上传文件并检测进度
List<string> files = ftpClient.GetFiles("/");//列出 ftp 服务端文件列表
...
16、加密解密
var enc="123456".MDString();// MD5 加密
var enc="123456".MDString("abc");// MD5 加盐加密
var enc="123456".MDString2();// MD5 两次加密
var enc="123456".MDString2("abc");// MD5 两次加盐加密
var enc="123456".MDString3();// MD5 三次加密
var enc="123456".MDString3("abc");// MD5 三次加盐加密
string aes = "123456".AESEncrypt();// AES 加密为密文
string s = aes.AESDecrypt(); //AES 解密为明文
string aes = "123456".AESEncrypt("abc");// AES 密钥加密为密文
string s = aes.AESDecrypt("abc"); //AES 密钥解密为明文
string enc = "123456".DesEncrypt();// DES 加密为密文
string s = enc.DesDecrypt(); //DES 解密为明文
string enc = "123456".DesEncrypt("abcdefgh");// DES 密钥加密为密文
string s = enc.DesDecrypt("abcdefgh"); //DES 密钥解密为明文
RsaKey rsaKey = RsaCrypt.GenerateRsaKeys();// 生成 RSA 密钥对
string encrypt = "123456".RSAEncrypt(rsaKey.PublicKey);// 公钥加密
string s = encrypt.RSADecrypt(rsaKey.PrivateKey);// 私钥解密
17、实体校验
public class MyClass
{
[ ]
public string Email { get; set; }
[ ]
public string PhoneNumber { get; set; }
[ ]
public string IP { get; set; }
[ ]
public int Age { get; set; }
[//密码复杂度校验 ]
public string Password { get; set; }
}
18、邮件发送
new Email()
{
SmtpServer = "smtp.masuit.com",// SMTP 服务器
SmtpPort = 25, // SMTP 服务器端口
EnableSsl = true,//使用 SSL
Username = "admin@masuit.com",// 邮箱用户名
Password = "123456",// 邮箱密码
Tos = "10000@qq.com,10001@qq.com", //收件人
Subject = "测试邮件",//邮件标题
Body = "你好啊",//邮件内容
}.SendAsync(s =>
{
Console.WriteLine(s);// 发送成功后的回调
});// 异步发送邮件
19、敏感信息掩码
"13123456789".Mask(); // 131****5678
"admin@masuit.com".MaskEmail(); // a****n@masuit.com
20、更多请点击本文底部“阅读原文”了解更多通用工具方法接口,解锁 Masuit.Tools 的各类骚操作!
喜欢这个项目的话就点击本文底部“阅读原文”,Star、Fork、Follow素质三连关注一下吧。
往期精彩回顾
?点击阅读原文,素质三连