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;
}
}
}