Browse Source

.NET Core版本7z压缩采用依赖注入方式

懒得勤快 6 years ago
parent
commit
231279c0c5

+ 15 - 2
Masuit.Tools.Core/AspNetCore/Extensions/ServiceCollectionExtensions.cs

@@ -1,9 +1,9 @@
 using Masuit.Tools.AspNetCore.ResumeFileResults.Executor;
 using Masuit.Tools.AspNetCore.ResumeFileResults.ResumeFileResult;
+using Masuit.Tools.Files;
 using Microsoft.AspNetCore.Mvc.Infrastructure;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection.Extensions;
-using System;
 
 namespace Masuit.Tools.AspNetCore.ResumeFileResults.Extensions
 {
@@ -17,7 +17,6 @@ namespace Masuit.Tools.AspNetCore.ResumeFileResults.Extensions
         /// </summary>
         /// <param name="services"></param>
         /// <returns></returns>
-        /// <exception cref="ArgumentNullException"></exception>
         public static IServiceCollection AddResumeFileResult(this IServiceCollection services)
         {
             services.TryAddSingleton<IActionResultExecutor<ResumePhysicalFileResult>, ResumePhysicalFileResultExecutor>();
@@ -26,5 +25,19 @@ namespace Masuit.Tools.AspNetCore.ResumeFileResults.Extensions
             services.TryAddSingleton<IActionResultExecutor<ResumeFileContentResult>, ResumeFileContentResultExecutor>();
             return services;
         }
+
+        /// <summary>
+        /// 注入7z压缩
+        /// </summary>
+        /// <param name="services"></param>
+        /// <param name="enableCache">是否启用缓存</param>
+        /// <returns></returns>
+        public static IServiceCollection AddSevenZipCompressor(this IServiceCollection services, bool enableCache = true)
+        {
+            services.AddHttpClient();
+            services.TryAddTransient<ISevenZipCompressor, SevenZipCompressor>();
+            SevenZipCompressor.EnableCache = enableCache;
+            return services;
+        }
     }
 }

+ 35 - 14
Masuit.Tools.Core/Files/Compress.cs

@@ -1,4 +1,5 @@
-using Microsoft.Win32;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Win32;
 using SharpCompress.Archives;
 using SharpCompress.Archives.Rar;
 using SharpCompress.Archives.Zip;
@@ -19,15 +20,28 @@ namespace Masuit.Tools.Files
     /// <summary>
     /// 7z压缩
     /// </summary>
-    public static class SevenZipCompressor
+    public class SevenZipCompressor : ISevenZipCompressor
     {
+        private readonly HttpClient _httpClient;
+        private static readonly MemoryCache _memoryCache = new MemoryCache(new MemoryCacheOptions());
+        internal static bool EnableCache { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="httpClientFactory"></param>
+        public SevenZipCompressor(IHttpClientFactory httpClientFactory)
+        {
+            _httpClient = httpClientFactory.CreateClient();
+        }
+
         /// <summary>
         /// 将多个文件压缩到一个文件流中,可保存为zip文件,方便于web方式下载
         /// </summary>
         /// <param name="files">多个文件路径,文件或文件夹,或网络路径http/https</param>
         /// <param name="rootdir"></param>
         /// <returns>文件流</returns>
-        public static MemoryStream ZipStream(List<string> files, string rootdir = "")
+        public MemoryStream ZipStream(List<string> files, string rootdir = "")
         {
             using (var archive = CreateZipArchive(files, rootdir))
             {
@@ -50,7 +64,7 @@ namespace Masuit.Tools.Files
         /// <param name="files">多个文件路径,文件或文件夹</param>
         /// <param name="zipFile">压缩到...</param>
         /// <param name="rootdir">压缩包内部根文件夹</param>
-        public static void Zip(List<string> files, string zipFile, string rootdir = "")
+        public void Zip(List<string> files, string zipFile, string rootdir = "")
         {
             using (var archive = CreateZipArchive(files, rootdir))
             {
@@ -71,7 +85,7 @@ namespace Masuit.Tools.Files
         /// <param name="rar">rar文件</param>
         /// <param name="dir">解压到...</param>
         /// <param name="ignoreEmptyDir">忽略空文件夹</param>
-        public static void UnRar(string rar, string dir = "", bool ignoreEmptyDir = true)
+        public void UnRar(string rar, string dir = "", bool ignoreEmptyDir = true)
         {
             if (string.IsNullOrEmpty(dir))
             {
@@ -97,7 +111,7 @@ namespace Masuit.Tools.Files
         /// <param name="compressedFile">rar文件</param>
         /// <param name="dir">解压到...</param>
         /// <param name="ignoreEmptyDir">忽略空文件夹</param>
-        public static void Decompress(string compressedFile, string dir = "", bool ignoreEmptyDir = true)
+        public void Decompress(string compressedFile, string dir = "", bool ignoreEmptyDir = true)
         {
             if (string.IsNullOrEmpty(dir))
             {
@@ -139,7 +153,7 @@ namespace Masuit.Tools.Files
         /// <param name="files"></param>
         /// <param name="rootdir"></param>
         /// <returns></returns>
-        private static ZipArchive CreateZipArchive(List<string> files, string rootdir)
+        private ZipArchive CreateZipArchive(List<string> files, string rootdir)
         {
             var archive = ZipArchive.Create();
             var dic = GetFileEntryMaps(files);
@@ -153,11 +167,15 @@ namespace Masuit.Tools.Files
                 //var paths = remoteFiles.Select(s => new Uri(s).PathAndQuery).ToList();
                 //string pathname = new string(paths.First().Substring(0, paths.Min(s => s.Length)).TakeWhile((c, i) => paths.All(s => s[i] == c)).ToArray());
                 //Dictionary<string, string> pathDic = paths.ToDictionary(s => s, s => s.Substring(pathname.Length));
-                using (var httpClient = new HttpClient())
+                Parallel.ForEach(remoteFiles, url =>
                 {
-                    Parallel.ForEach(remoteFiles, url =>
+                    if (_memoryCache.TryGetValue(url, out Stream ms))
                     {
-                        httpClient.GetAsync(url).ContinueWith(async t =>
+                        archive.AddEntry(Path.Combine(rootdir, Path.GetFileName(new Uri(url).AbsolutePath.Trim('/'))), ms);
+                    }
+                    else
+                    {
+                        _httpClient.GetAsync(url).ContinueWith(async t =>
                         {
                             if (t.IsCompleted)
                             {
@@ -165,13 +183,16 @@ namespace Masuit.Tools.Files
                                 if (res.IsSuccessStatusCode)
                                 {
                                     Stream stream = await res.Content.ReadAsStreamAsync();
-                                    //archive.AddEntry(Path.Combine(rootdir, pathDic[new Uri(url).AbsolutePath.Trim('/')]), stream);
                                     archive.AddEntry(Path.Combine(rootdir, Path.GetFileName(new Uri(url).AbsolutePath.Trim('/'))), stream);
+                                    if (EnableCache)
+                                    {
+                                        _memoryCache.Set(url, stream, TimeSpan.FromMinutes(10));
+                                    }
                                 }
                             }
                         }).Wait();
-                    });
-                }
+                    }
+                });
             }
             return archive;
         }
@@ -181,7 +202,7 @@ namespace Masuit.Tools.Files
         /// </summary>
         /// <param name="files"></param>
         /// <returns></returns>
-        private static Dictionary<string, string> GetFileEntryMaps(List<string> files)
+        private Dictionary<string, string> GetFileEntryMaps(List<string> files)
         {
             List<string> fileList = new List<string>();
 

+ 43 - 0
Masuit.Tools.Core/Files/ISevenZipCompressor.cs

@@ -0,0 +1,43 @@
+using System.Collections.Generic;
+using System.IO;
+
+namespace Masuit.Tools.Files
+{
+    /// <summary>
+    /// 7z压缩
+    /// </summary>
+    public interface ISevenZipCompressor
+    {
+        /// <summary>
+        /// 解压文件,自动检测压缩包类型
+        /// </summary>
+        /// <param name="compressedFile">rar文件</param>
+        /// <param name="dir">解压到...</param>
+        /// <param name="ignoreEmptyDir">忽略空文件夹</param>
+        void Decompress(string compressedFile, string dir = "", bool ignoreEmptyDir = true);
+
+        /// <summary>
+        /// 解压rar文件
+        /// </summary>
+        /// <param name="rar">rar文件</param>
+        /// <param name="dir">解压到...</param>
+        /// <param name="ignoreEmptyDir">忽略空文件夹</param>
+        void UnRar(string rar, string dir = "", bool ignoreEmptyDir = true);
+
+        /// <summary>
+        /// 压缩多个文件
+        /// </summary>
+        /// <param name="files">多个文件路径,文件或文件夹</param>
+        /// <param name="zipFile">压缩到...</param>
+        /// <param name="rootdir">压缩包内部根文件夹</param>
+        void Zip(List<string> files, string zipFile, string rootdir = "");
+
+        /// <summary>
+        /// 将多个文件压缩到一个文件流中,可保存为zip文件,方便于web方式下载
+        /// </summary>
+        /// <param name="files">多个文件路径,文件或文件夹,或网络路径http/https</param>
+        /// <param name="rootdir"></param>
+        /// <returns>文件流</returns>
+        MemoryStream ZipStream(List<string> files, string rootdir = "");
+    }
+}

+ 1 - 1
Masuit.Tools.Core/Masuit.Tools.Core.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <TargetFramework>netcoreapp2.1</TargetFramework>
-    <Version>2.2.3</Version>
+    <Version>2.2.3.1</Version>
     <Authors>懒得勤快</Authors>
     <Company>masuit.com</Company>
     <Description>包含一些常用的操作类,大都是静态类,加密解密,反射操作,硬件信息,字符串扩展方法,日期时间扩展操作,大文件拷贝,图像裁剪,html处理,验证码、NoSql等常用封装。