using CloudBuilder.Core.Authorization; using CloudBuilder.Core.DatabaseAccessor.Entity; using CloudBuilder.Core.DependencyInjection.Task; using CloudBuilder.Core.Policy; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using System; using System.Text; namespace CloudBuilder.Topshelf.Task { /// /// 分隔文件并保存為UTF-8格式, /// 【encoding】原文件格式必填, /// 【split_size】分隔大小单位为M 【split_number】分隔文件數量,這兩個參數必填其中之一, /// 【input】文件夹或者文件路径必填, /// 【output】输出文件夹路径 /// task:SplitFileSaveUTF8Task encoding:GB2312 split_size:1 input:D:\NET8\AIML文档\汉语大词典1994+订补+资料Txt output:D:\NET8\AIML文档\汉语大词典1994UTF8 /// task:SplitFileSaveUTF8Task encoding:GB2312 split_number:1 input:D:\NET8\AIML文档\汉语大词典1994+订补+资料Txt output:D:\NET8\AIML文档\汉语大词典1994UTF8 /// public class SplitFileSaveUTF8Task : IScheduleTask { private readonly IApplicationService service; public SplitFileSaveUTF8Task(IApplicationService service) { this.service = service; } public void Run(Dictionary bodyDict) { if (!bodyDict.ContainsKey("input")) return; if (!bodyDict.ContainsKey("encoding")) return; if (!bodyDict.ContainsKey("output")) return; int splitNumber = 0; if (bodyDict.ContainsKey("split_number")) splitNumber = Convert.ToInt32(bodyDict["split_number"]); string encoding = bodyDict["encoding"]; string output = bodyDict["output"]; string input = bodyDict["input"]; decimal splitSize = 0; if (bodyDict.ContainsKey("split_size")) splitSize = Convert.ToDecimal(bodyDict["split_size"]); List files = PackFiles(input); foreach (string file in files) { SaveFile(encoding, file, output, splitNumber, splitSize); } } private void SaveFile(string encoding, string fileName, string output, int splitNumber, decimal splitSize) { System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); string context = File.ReadAllText(fileName, Encoding.GetEncoding(encoding)); int maxlength = context.Length; int maxSplit = maxlength; //如果傳入的是分隔數,以分隔數為準 if (splitNumber > 0) { maxSplit = (int)Math.Ceiling(maxlength * 1.0m / splitNumber); } if (splitSize > 0 && splitNumber == 0) { FileInfo fileInfo = new FileInfo(fileName); splitNumber = (int)Math.Ceiling(fileInfo.Length / ((1024m * 1024m) * splitSize)); maxSplit = (int)Math.Ceiling(maxlength * 1.0m / splitNumber); } int reqLenth = maxSplit; string ct = string.Empty; for (int i = 0; i < splitNumber; i++) { if (i > 0 && splitNumber == i + 1) { reqLenth = maxlength % maxSplit; } if (splitNumber > 1) { ct = context.Substring(i * maxSplit, reqLenth); } else { ct = context; } string outputPath = Path.Combine(output, Path.GetFileNameWithoutExtension(fileName) + string.Format("_{0}", i+1) + Path.GetExtension(fileName)); File.WriteAllText(outputPath, ct, Encoding.UTF8); } } private List PackFiles(string input) { List files = new List(); if (Path.HasExtension(input) && !string.IsNullOrEmpty(input)) { if (File.Exists(input)) { files.Add(input); } } else if (!string.IsNullOrEmpty(input)) { if (Directory.Exists(input)) { string[] tempFiles = Directory.GetFiles(input); if (tempFiles != null && tempFiles.Length > 0) { files.AddRange(tempFiles); } } } return files; } } }