136 lines
4.5 KiB
C#
136 lines
4.5 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 分隔文件并保存為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
|
|
/// </summary>
|
|
public class SplitFileSaveUTF8Task : IScheduleTask
|
|
{
|
|
private readonly IApplicationService service;
|
|
|
|
public SplitFileSaveUTF8Task(IApplicationService service)
|
|
{
|
|
this.service = service;
|
|
}
|
|
|
|
public void Run(Dictionary<string, string> 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<string> 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<string> PackFiles(string input)
|
|
{
|
|
List<string> files = new List<string>();
|
|
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;
|
|
}
|
|
|
|
}
|
|
}
|