项目引用更新
This commit is contained in:
@@ -22,7 +22,7 @@ Yi框架-一套与SqlSugar一样爽的.Net6低代码开源框架。
|
||||
适合.Net6学习、Sqlsugar学习 、项目二次开发。
|
||||
集大成者,终究轮子
|
||||
|
||||
Yi框架最新版本标签:`v1.1.7`,具体版本可以查看标签迭代
|
||||
Yi框架最新版本标签:`v1.1.8`,具体版本可以查看标签迭代
|
||||
|
||||
(项目与Sqlsugar同步更新,但这作者老杰哥代码天天爆肝到凌晨两点,我们也尽量会跟上他的脚步。更新频繁,所以可watching持续关注。)
|
||||
|
||||
|
||||
@@ -31,10 +31,6 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.DTOModel\Yi.Framework.DTOModel.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Interface\Yi.Framework.Interface.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Model\Yi.Framework.Model.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Service\Yi.Framework.Service.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.WebCore\Yi.Framework.WebCore.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
430
Yi.Framework.Net6/Yi.Framework.Common/Base/NullValue.cs
Normal file
430
Yi.Framework.Net6/Yi.Framework.Common/Base/NullValue.cs
Normal file
@@ -0,0 +1,430 @@
|
||||
namespace System
|
||||
{
|
||||
#region 无值定义
|
||||
|
||||
/// <summary>
|
||||
/// 无值定义
|
||||
/// </summary>
|
||||
public class NullValue
|
||||
{
|
||||
/// <summary>
|
||||
/// 唯一识别型的默认无值
|
||||
/// </summary>
|
||||
public static readonly Guid Guid = Guid.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 日期时间的默认无值
|
||||
/// </summary>
|
||||
/// <remarks>解决C#DateTime最小值是SQL 2005不允许的范围内</remarks>
|
||||
public static readonly DateTime DateTime = DateTime.Parse("1753-1-1 12:00:01");
|
||||
|
||||
/// <summary>
|
||||
/// JavaScript日期时间的默认无值
|
||||
/// </summary>
|
||||
/// <remarks></remarks>
|
||||
public static readonly DateTime JavaScriptDateTime = DateTime.Parse("1970-1-1 00:00:00");
|
||||
|
||||
#region 数字类型
|
||||
|
||||
/// <summary>
|
||||
/// 短整数的默认无值
|
||||
/// </summary>
|
||||
public const short ShortInterger = -1;//short.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// 整数的默认无值
|
||||
/// </summary>
|
||||
public const int Interger = -1;//int.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// 长整数的默认无值
|
||||
/// </summary>
|
||||
public const long LongInterger = -1;//long.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// Decimal数的默认无值
|
||||
/// </summary>
|
||||
public const decimal Decimal = -1;//decimal.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// Float数的默认无值
|
||||
/// </summary>
|
||||
public const float Float = -1;//float.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// Double数的默认无值
|
||||
/// </summary>
|
||||
public const double Double = -1;//double.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// Byte数的默认无值
|
||||
/// </summary>
|
||||
public const byte Byte = byte.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// SByte数的默认无值
|
||||
/// </summary>
|
||||
public const sbyte SByte = sbyte.MinValue;
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 字串的默认无值
|
||||
/// </summary>
|
||||
public static readonly string String = String.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 一般对象的判断
|
||||
/// </summary>
|
||||
public const Object Object = null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 无值的扩展方法
|
||||
|
||||
/// <summary>
|
||||
/// 无值的扩展方法
|
||||
/// </summary>
|
||||
public static class NullValueExtensions
|
||||
{
|
||||
#region 一般类型
|
||||
|
||||
public static Guid TryToGuid(this string guid)
|
||||
{
|
||||
if (Guid.TryParse(guid, out var guid1))
|
||||
{
|
||||
return guid1;
|
||||
}
|
||||
return Guid.Empty;
|
||||
|
||||
}
|
||||
|
||||
public static string TryStringNull(this string value)
|
||||
{
|
||||
return value == null ? "" : value;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Object类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this object value)
|
||||
{
|
||||
if (value == null || value == NullValue.Object)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Object类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this object value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
public static bool IsGuidNotNull(this Guid? value)
|
||||
{
|
||||
return !value.IsGuidNull();
|
||||
}
|
||||
public static bool IsGuidNull(this Guid? value)
|
||||
{
|
||||
if (value == null || value == Guid.Empty)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
/// <summary>
|
||||
/// String类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this String value)
|
||||
{
|
||||
if (string.IsNullOrEmpty(value) || string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// String类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this String value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Guid类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this Guid value)
|
||||
{
|
||||
if (value == NullValue.Guid)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Guid类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this Guid value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
#region 数字类型
|
||||
|
||||
/// <summary>
|
||||
/// ShortInterger类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this short value)
|
||||
{
|
||||
if (value == NullValue.ShortInterger)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ShortInterger类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this short value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interger类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this int value)
|
||||
{
|
||||
if (value == NullValue.Interger)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interger类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this int value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// LongInterger类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this long value)
|
||||
{
|
||||
if (value == NullValue.LongInterger)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// LongInterger类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this long value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decimal类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this decimal value)
|
||||
{
|
||||
if (value == NullValue.Decimal)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decimal类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this decimal value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Float类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this float value)
|
||||
{
|
||||
if (value == NullValue.Float)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Float类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this float value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Double类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this double value)
|
||||
{
|
||||
if (value == NullValue.Double)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Double类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this double value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Byte类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this byte value)
|
||||
{
|
||||
if (value == NullValue.Byte)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Byte类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this byte value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SByte类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this sbyte value)
|
||||
{
|
||||
if (value == NullValue.SByte)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SByte类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this sbyte value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// DateTime类型无值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否为空(true--真,false--假)</returns>
|
||||
public static bool IsNull(this DateTime value)
|
||||
{
|
||||
if (value == DateTime.MinValue || value <= NullValue.DateTime || value == NullValue.JavaScriptDateTime)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DateTime类型有值判断
|
||||
/// </summary>
|
||||
/// <param name="value">待判断对象</param>
|
||||
/// <returns>是否不为空(true--真,false--假)</returns>
|
||||
public static bool IsNotNull(this DateTime value)
|
||||
{
|
||||
return !value.IsNull();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Yi.Framework.Common.Helper
|
||||
{
|
||||
public class Compare<T, C> : IEqualityComparer<T>
|
||||
{
|
||||
private Func<T, C> _getField;
|
||||
public Compare(Func<T, C> getfield)
|
||||
{
|
||||
this._getField = getfield;
|
||||
}
|
||||
public bool Equals(T x, T y)
|
||||
{
|
||||
return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y));
|
||||
}
|
||||
public int GetHashCode(T obj)
|
||||
{
|
||||
return EqualityComparer<C>.Default.GetHashCode(this._getField(obj));
|
||||
}
|
||||
}
|
||||
public static class DistinctHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 自定义Distinct扩展方法
|
||||
/// </summary>
|
||||
/// <typeparam name="T">要去重的对象类</typeparam>
|
||||
/// <typeparam name="C">自定义去重的字段类型</typeparam>
|
||||
/// <param name="source">要去重的对象</param>
|
||||
/// <param name="getfield">获取自定义去重字段的委托</param>
|
||||
/// <returns></returns>
|
||||
public static IEnumerable<T> DistinctNew<T, C>(this IEnumerable<T> source, Func<T, C> getfield)
|
||||
{
|
||||
return source.Distinct(new Compare<T, C>(getfield));
|
||||
}
|
||||
}
|
||||
}
|
||||
397
Yi.Framework.Net6/Yi.Framework.Common/Helper/ZipHelper.cs
Normal file
397
Yi.Framework.Net6/Yi.Framework.Common/Helper/ZipHelper.cs
Normal file
@@ -0,0 +1,397 @@
|
||||
/***
|
||||
* Title:"基础工具" 项目
|
||||
* Title:"基础工具" 项目
|
||||
* 主题:压缩包帮助类
|
||||
* Description:
|
||||
* 功能:
|
||||
* 1、压缩单个文件
|
||||
* 2、压缩多个文件
|
||||
* 3、压缩多层目录
|
||||
* 4、递归遍历目录
|
||||
* 5、解压缩一个 zip 文件
|
||||
* 6、获取压缩文件中指定类型的文件
|
||||
* 7、获取压缩文件中的所有文件
|
||||
* Date:2021
|
||||
* Version:0.1版本
|
||||
* Author:Coffee
|
||||
* Modify Recoder:
|
||||
*/
|
||||
|
||||
using ICSharpCode.SharpZipLib.Zip;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace Yi.Framework.Common.Helper
|
||||
{
|
||||
public class ZipHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 压缩单个文件
|
||||
/// </summary>
|
||||
/// <param name="fileToZip">要压缩的文件</param>
|
||||
/// <param name="zipedFile">压缩后的文件</param>
|
||||
/// <param name="compressionLevel">压缩等级</param>
|
||||
/// <param name="blockSize">每次写入大小</param>
|
||||
public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize)
|
||||
{
|
||||
//如果文件没有找到,则报错
|
||||
if (!File.Exists(fileToZip))
|
||||
{
|
||||
throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");
|
||||
}
|
||||
|
||||
using (FileStream ZipFile = File.Create(zipedFile))
|
||||
{
|
||||
using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
|
||||
{
|
||||
using (FileStream StreamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read))
|
||||
{
|
||||
string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);
|
||||
|
||||
ZipEntry ZipEntry = new ZipEntry(fileName);
|
||||
|
||||
ZipStream.PutNextEntry(ZipEntry);
|
||||
|
||||
ZipStream.SetLevel(compressionLevel);
|
||||
|
||||
byte[] buffer = new byte[blockSize];
|
||||
|
||||
int sizeRead = 0;
|
||||
|
||||
try
|
||||
{
|
||||
do
|
||||
{
|
||||
sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
|
||||
ZipStream.Write(buffer, 0, sizeRead);
|
||||
}
|
||||
while (sizeRead > 0);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
StreamToZip.Close();
|
||||
}
|
||||
|
||||
ZipStream.Finish();
|
||||
ZipStream.Close();
|
||||
}
|
||||
|
||||
ZipFile.Close();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 压缩单个文件
|
||||
/// </summary>
|
||||
/// <param name="fileToZip">要进行压缩的文件名</param>
|
||||
/// <param name="zipedFile">压缩后生成的压缩文件名</param>
|
||||
public static void ZipFile(string fileToZip, string zipedFile)
|
||||
{
|
||||
//如果文件没有找到,则报错
|
||||
if (!File.Exists(fileToZip))
|
||||
{
|
||||
throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");
|
||||
}
|
||||
|
||||
using (FileStream fs = File.OpenRead(fileToZip))
|
||||
{
|
||||
byte[] buffer = new byte[fs.Length];
|
||||
fs.Read(buffer, 0, buffer.Length);
|
||||
fs.Close();
|
||||
|
||||
using (FileStream ZipFile = File.Create(zipedFile))
|
||||
{
|
||||
using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
|
||||
{
|
||||
string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);
|
||||
ZipEntry ZipEntry = new ZipEntry(fileName);
|
||||
ZipStream.PutNextEntry(ZipEntry);
|
||||
ZipStream.SetLevel(5);
|
||||
|
||||
ZipStream.Write(buffer, 0, buffer.Length);
|
||||
ZipStream.Finish();
|
||||
ZipStream.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 压缩多个文件到指定路径
|
||||
/// </summary>
|
||||
/// <param name="sourceFileNames">压缩到哪个路径</param>
|
||||
/// <param name="zipFileName">压缩文件名称</param>
|
||||
public static void ZipFile(List<string> sourceFileNames, string zipFileName)
|
||||
{
|
||||
//压缩文件打包
|
||||
using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFileName)))
|
||||
{
|
||||
s.SetLevel(9);
|
||||
byte[] buffer = new byte[4096];
|
||||
foreach (string file in sourceFileNames)
|
||||
{
|
||||
if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
|
||||
{
|
||||
string pPath = "";
|
||||
pPath += Path.GetFileName(file);
|
||||
pPath += "\\";
|
||||
ZipSetp(file, s, pPath, sourceFileNames);
|
||||
}
|
||||
else // 否则直接压缩文件
|
||||
{
|
||||
|
||||
ZipEntry entry = new ZipEntry(Path.GetFileName(file));
|
||||
entry.DateTime = DateTime.Now;
|
||||
s.PutNextEntry(entry);
|
||||
using (FileStream fs = File.OpenRead(file))
|
||||
{
|
||||
int sourceBytes;
|
||||
do
|
||||
{
|
||||
sourceBytes = fs.Read(buffer, 0, buffer.Length);
|
||||
s.Write(buffer, 0, sourceBytes);
|
||||
} while (sourceBytes > 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
s.Finish();
|
||||
s.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 压缩多层目录
|
||||
/// </summary>
|
||||
/// <param name="strDirectory">待压缩目录</param>
|
||||
/// <param name="zipedFile">压缩后生成的压缩文件名,绝对路径</param>
|
||||
public static void ZipFileDirectory(string strDirectory, string zipedFile)
|
||||
{
|
||||
using (FileStream ZipFile = File.Create(zipedFile))
|
||||
{
|
||||
using (ZipOutputStream s = new ZipOutputStream(ZipFile))
|
||||
{
|
||||
s.SetLevel(9);
|
||||
ZipSetp(strDirectory, s, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 压缩多层目录
|
||||
/// </summary>
|
||||
/// <param name="strDirectory">待压缩目录</param>
|
||||
/// <param name="zipedFile">压缩后生成的压缩文件名,绝对路径</param>
|
||||
/// <param name="files">指定要压缩的文件列表(完全路径)</param>
|
||||
public static void ZipFileDirectory(string strDirectory, string zipedFile, List<string> files)
|
||||
{
|
||||
using (FileStream ZipFile = File.Create(zipedFile))
|
||||
{
|
||||
using (ZipOutputStream s = new ZipOutputStream(ZipFile))
|
||||
{
|
||||
s.SetLevel(9);
|
||||
ZipSetp(strDirectory, s, "", files);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 递归遍历目录
|
||||
/// </summary>
|
||||
/// <param name="strDirectory">需遍历的目录</param>
|
||||
/// <param name="s">压缩输出流对象</param>
|
||||
/// <param name="parentPath">The parent path.</param>
|
||||
/// <param name="files">需要压缩的文件</param>
|
||||
private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, List<string> files = null!)
|
||||
{
|
||||
if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)
|
||||
{
|
||||
strDirectory += Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
string[] filenames = Directory.GetFileSystemEntries(strDirectory);
|
||||
|
||||
byte[] buffer = new byte[4096];
|
||||
foreach (string file in filenames)// 遍历所有的文件和目录
|
||||
{
|
||||
if (files != null && !files.Contains(file))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
|
||||
{
|
||||
string pPath = parentPath;
|
||||
pPath += Path.GetFileName(file);
|
||||
pPath += "\\";
|
||||
ZipSetp(file, s, pPath, files!);
|
||||
}
|
||||
else // 否则直接压缩文件
|
||||
{
|
||||
//打开压缩文件
|
||||
string fileName = parentPath + Path.GetFileName(file);
|
||||
ZipEntry entry = new ZipEntry(fileName);
|
||||
|
||||
entry.DateTime = DateTime.Now;
|
||||
|
||||
s.PutNextEntry(entry);
|
||||
using (FileStream fs = File.OpenRead(file))
|
||||
{
|
||||
int sourceBytes;
|
||||
do
|
||||
{
|
||||
sourceBytes = fs.Read(buffer, 0, buffer.Length);
|
||||
s.Write(buffer, 0, sourceBytes);
|
||||
} while (sourceBytes > 0);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解压缩一个 zip 文件。
|
||||
/// </summary>
|
||||
/// <param name="zipedFile">压缩文件</param>
|
||||
/// <param name="strDirectory">解压目录</param>
|
||||
/// <param name="password">zip 文件的密码。</param>
|
||||
/// <param name="overWrite">是否覆盖已存在的文件。</param>
|
||||
public static void UnZip(string zipedFile, string strDirectory, bool overWrite, string password)
|
||||
{
|
||||
|
||||
if (strDirectory == "")
|
||||
strDirectory = Directory.GetCurrentDirectory();
|
||||
if (!strDirectory.EndsWith("\\"))
|
||||
strDirectory = strDirectory + "\\";
|
||||
|
||||
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))
|
||||
{
|
||||
if (password != null)
|
||||
{
|
||||
s.Password = password;
|
||||
}
|
||||
ZipEntry theEntry;
|
||||
|
||||
while ((theEntry = s.GetNextEntry()) != null)
|
||||
{
|
||||
string directoryName = "";
|
||||
string pathToZip = "";
|
||||
pathToZip = theEntry.Name;
|
||||
|
||||
if (pathToZip != "")
|
||||
directoryName = Path.GetDirectoryName(pathToZip) + "\\";
|
||||
|
||||
string fileName = Path.GetFileName(pathToZip);
|
||||
|
||||
Directory.CreateDirectory(strDirectory + directoryName);
|
||||
|
||||
if (fileName != "")
|
||||
{
|
||||
if (File.Exists(strDirectory + directoryName + fileName) && overWrite || !File.Exists(strDirectory + directoryName + fileName))
|
||||
{
|
||||
using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName))
|
||||
{
|
||||
int size = 2048;
|
||||
byte[] data = new byte[2048];
|
||||
while (true)
|
||||
{
|
||||
size = s.Read(data, 0, data.Length);
|
||||
|
||||
if (size > 0)
|
||||
streamWriter.Write(data, 0, size);
|
||||
else
|
||||
break;
|
||||
}
|
||||
streamWriter.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
s.Close();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解压缩一个 zip 文件。
|
||||
/// </summary>
|
||||
/// <param name="zipedFile">压缩文件</param>
|
||||
/// <param name="strDirectory">解压目录</param>
|
||||
/// <param name="overWrite">是否覆盖已存在的文件。</param>
|
||||
public static void UnZip(string zipedFile, string strDirectory, bool overWrite)
|
||||
{
|
||||
UnZip(zipedFile, strDirectory, overWrite, null!);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解压缩一个 zip 文件。
|
||||
/// 覆盖已存在的文件。
|
||||
/// </summary>
|
||||
/// <param name="zipedFile">压缩文件</param>
|
||||
/// <param name="strDirectory">解压目录</param>
|
||||
public static void UnZip(string zipedFile, string strDirectory)
|
||||
{
|
||||
UnZip(zipedFile, strDirectory, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取压缩文件中指定类型的文件
|
||||
/// </summary>
|
||||
/// <param name="zipedFile">压缩文件</param>
|
||||
/// <param name="fileExtension">文件类型(.txt|.exe)</param>
|
||||
/// <returns>文件名称列表(包含子目录)</returns>
|
||||
public static List<string> GetFiles(string zipedFile, List<string> fileExtension)
|
||||
{
|
||||
List<string> files = new List<string>();
|
||||
if (!File.Exists(zipedFile))
|
||||
{
|
||||
//return files;
|
||||
throw new FileNotFoundException(zipedFile);
|
||||
}
|
||||
|
||||
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))
|
||||
{
|
||||
ZipEntry theEntry;
|
||||
while ((theEntry = s.GetNextEntry()) != null)
|
||||
{
|
||||
if (theEntry.IsFile)
|
||||
{
|
||||
//Console.WriteLine("Name : {0}", theEntry.Name);
|
||||
if (fileExtension != null)
|
||||
{
|
||||
if (fileExtension.Contains(Path.GetExtension(theEntry.Name)))
|
||||
{
|
||||
files.Add(theEntry.Name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
files.Add(theEntry.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
s.Close();
|
||||
}
|
||||
|
||||
return files;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取压缩文件中的所有文件
|
||||
/// </summary>
|
||||
/// <param name="zipedFile">压缩文件</param>
|
||||
/// <returns>文件名称列表(包含子目录)</returns>
|
||||
public static List<string> GetFiles(string zipedFile)
|
||||
{
|
||||
return GetFiles(zipedFile, null!);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}//Class_end
|
||||
|
||||
}
|
||||
@@ -8,6 +8,7 @@
|
||||
<PackageReference Include="EPPlus" Version="5.8.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="6.0.3" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageReference Include="SharpZipLib" Version="1.3.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -22,8 +22,19 @@ namespace Yi.Framework.Core
|
||||
{
|
||||
this._RedisOptions = redisConnOptions.CurrentValue;
|
||||
}
|
||||
//public CSRedisClient GetClient()
|
||||
//{
|
||||
// return client;
|
||||
//}
|
||||
//private CSRedisClient client=null;
|
||||
|
||||
// 为了以后全链路做准备
|
||||
|
||||
private T TryCatch<T>(MyAction<T> action)
|
||||
{
|
||||
//Stopwatch sw = Stopwatch.StartNew();
|
||||
////Exception ex = null;
|
||||
////bool isError = false;
|
||||
var client2 = new CSRedisClient($"{_RedisOptions.Host}:{_RedisOptions.Prot},password={_RedisOptions.Password},defaultDatabase ={ _RedisOptions.DB }");
|
||||
T result;
|
||||
try
|
||||
@@ -34,7 +45,9 @@ namespace Yi.Framework.Core
|
||||
{
|
||||
object p = null;
|
||||
result = (T)p;
|
||||
//isError = true;
|
||||
Console.WriteLine(exinfo);
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -55,6 +68,11 @@ namespace Yi.Framework.Core
|
||||
return this.TryCatch((u) => u.Del(key));
|
||||
}
|
||||
|
||||
public long HRemove(string key, params string[] par)
|
||||
{
|
||||
return this.TryCatch((u) => u.HDel(key, par));
|
||||
}
|
||||
|
||||
public T Get<T>(string key)
|
||||
{
|
||||
return this.TryCatch<T>((u) => u.Get<T>(key));
|
||||
@@ -68,9 +86,36 @@ namespace Yi.Framework.Core
|
||||
{
|
||||
return this.TryCatch<bool>((u) => u.Set(key, data));
|
||||
}
|
||||
public bool AddHash<T>(string key,string field, T data)
|
||||
public T QueuePop<T>(string key)
|
||||
{
|
||||
return this.TryCatch<bool>((u)=>u.HSet(key ,field,data));
|
||||
return this.TryCatch<T>((u) => u.RPop<T>(key));
|
||||
}
|
||||
public long QueuePush<T>(string key, T data)
|
||||
{
|
||||
return this.TryCatch<long>((u) => u.LPush<T>(key, data));
|
||||
}
|
||||
public long QueueLen(string key)
|
||||
{
|
||||
return TryCatch((u) => u.LLen(key));
|
||||
}
|
||||
|
||||
public bool HSet<T>(string key, string fieId, T data)
|
||||
{
|
||||
return this.TryCatch<bool>((u) => u.HSet(key, fieId, data));
|
||||
}
|
||||
public bool HSet<T>(string key, string fieId, T data, TimeSpan time)
|
||||
{
|
||||
return this.TryCatch<bool>((u) =>
|
||||
{
|
||||
var res = u.HSet(key, fieId, data);
|
||||
u.Expire(key, time);
|
||||
return res;
|
||||
});
|
||||
}
|
||||
|
||||
public CSRedisClient Db()
|
||||
{
|
||||
return new CSRedisClient($"{_RedisOptions.Host}:{_RedisOptions.Prot},password={_RedisOptions.Password},defaultDatabase ={ _RedisOptions.DB }");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.Common\Yi.Framework.Common.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Model\Yi.Framework.Model.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Task\Yi.Framework.Job.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.DTOModel\Yi.Framework.DTOModel.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Model\Yi.Framework.Model.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Repository\Yi.Framework.Repository.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -25,5 +25,7 @@ namespace Yi.Framework.Repository
|
||||
public Task<bool> UseSqlAsync(string sql, object parameters = null);
|
||||
ISugarQueryable<T> QueryConditionHandler(QueryCondition pars);
|
||||
Task<bool> UpdateSuperSaveAsync(T data, Expression<Func<T, object>> columns);
|
||||
Task<List<T>> GetListAsync(Expression<Func<T, bool>> where, Expression<Func<T, object>> order, OrderByType orderByType = OrderByType.Desc);
|
||||
Task<T> GetFirstAsync(Expression<Func<T, bool>> where, Expression<Func<T, object>> order, OrderByType orderByType = OrderByType.Desc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -189,7 +189,23 @@ namespace Yi.Framework.Repository
|
||||
.ToStorage();
|
||||
return await x.AsInsertable.ExecuteCommandAsync() > 0;//插入可插入部分
|
||||
}
|
||||
/// <summary>
|
||||
/// 方法重载,多条件获取第一个值
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<T> GetFirstAsync(Expression<Func<T, bool>> where, Expression<Func<T, object>> order, OrderByType orderByType = OrderByType.Desc)
|
||||
{
|
||||
return await _Db.Queryable<T>().Where(where).OrderBy(order, orderByType).FirstAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 方法重载,多条件获取范围
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<T>> GetListAsync(Expression<Func<T, bool>> where, Expression<Func<T, object>> order, OrderByType orderByType = OrderByType.Desc)
|
||||
{
|
||||
return await _Db.Queryable<T>().Where(where).OrderBy(order, orderByType).ToListAsync();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.Common\Yi.Framework.Common.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Model\Yi.Framework.Model.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -9,11 +9,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.Core\Yi.Framework.Core.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.DTOModel\Yi.Framework.DTOModel.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Interface\Yi.Framework.Interface.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Model\Yi.Framework.Model.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Repository\Yi.Framework.Repository.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.Common\Yi.Framework.Common.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Model\Yi.Framework.Model.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Yi.Framework.Model.Models;
|
||||
using System.IdentityModel.Tokens.Jwt;
|
||||
using System.IO;
|
||||
|
||||
namespace Yi.Framework.WebCore
|
||||
{
|
||||
@@ -51,5 +52,42 @@ namespace Yi.Framework.WebCore
|
||||
//Name = claimlist.FirstOrDefault(u => u.Type == JwtRegisteredClaimNames.Name).Value
|
||||
};
|
||||
}
|
||||
|
||||
public static void FileInlineHandle(this HttpContext httpContext, string fileName)
|
||||
{
|
||||
string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.GetEncoding("UTF-8"));
|
||||
httpContext.Response.Headers.Add("Content-Disposition", "inline;filename=" + encodeFilename);
|
||||
|
||||
}
|
||||
public static void FileAttachmentHandle(this HttpContext httpContext, string fileName)
|
||||
{
|
||||
string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.GetEncoding("UTF-8"));
|
||||
httpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + encodeFilename);
|
||||
|
||||
}
|
||||
public static string GetLanguage(this HttpContext httpContext)
|
||||
{
|
||||
string res = "zh-CN";
|
||||
var str = httpContext.Request.Headers["Accept-Language"].FirstOrDefault();
|
||||
if (str.IsNotNull())
|
||||
{
|
||||
res = str.Split(",")[0];
|
||||
}
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
public static string GetBody(this HttpContext httpContext)
|
||||
{
|
||||
if (httpContext.Request.Body != null)
|
||||
{
|
||||
httpContext.Request.EnableBuffering();
|
||||
httpContext.Request.Body.Position = 0;
|
||||
StreamReader stream = new StreamReader(httpContext.Request.Body);
|
||||
return stream.ReadToEndAsync().GetAwaiter().GetResult();
|
||||
}
|
||||
return "";
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Yi.Framework.WebCore.MiddlewareExtend
|
||||
{
|
||||
public static class SqlsugarExtension
|
||||
{
|
||||
public static void AddSqlsugarServer(this IServiceCollection services)
|
||||
public static void AddSqlsugarServer(this IServiceCollection services, Action<SqlSugarClient> action = null)
|
||||
{
|
||||
|
||||
|
||||
@@ -61,6 +61,10 @@ namespace Yi.Framework.WebCore.MiddlewareExtend
|
||||
},
|
||||
db =>
|
||||
{
|
||||
if (action.IsNotNull())
|
||||
{
|
||||
action(db);
|
||||
}
|
||||
|
||||
db.Aop.DataExecuting = (oldValue, entityInfo) =>
|
||||
{
|
||||
|
||||
@@ -34,10 +34,6 @@
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Yi.Framework.Core\Yi.Framework.Core.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.DTOModel\Yi.Framework.DTOModel.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Interface\Yi.Framework.Interface.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Model\Yi.Framework.Model.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Repository\Yi.Framework.Repository.csproj" />
|
||||
<ProjectReference Include="..\Yi.Framework.Service\Yi.Framework.Service.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user