C# txt 文件分割
<appSettings>
<!--是否开启大文件分隔策略-->
<add key="BigFile.Split" value="true"/>
<!--当文件大于这个配置项时就执行文件分隔,单位:GB -->
<add key="BigFile.SplitMinFileSizeGB" value="10" />
<!--当文件大于这个配置项时就执行文件分隔,单位:MB -->
<add key="BigFile.SplitMinFileSizeMB" value="10" />
<!--当执行文件分割时,每个分隔出来的文件大小,单位:MB -->
<add key="BigFile.SplitFileSize" value="100"/>
<add key="BigFile.FilePath" value="d:\bigfile\sms6.api.yiche.com20191023.txt"/>
<add key="BigFile.FileSilitPathFormate" value="\\172.x1.xx.xx\文件拷贝\liulong\FTP\xx\2016-04-07\x_20160407{0}.txt"/>
</appSettings>
public class SplitFileStrategy2
{
public const byte Newline = 10;
public const byte Return = 13;
public void Split()
{
string file = ConfigurationManager.AppSettings.Get("BigFile.FilePath");
int splitMinFileSizeMB = Convert.ToInt32(ConfigurationManager.AppSettings.Get("BigFile.SplitMinFileSizeMB")) * 1024 * 1204;
int splitFileSize = Convert.ToInt32(ConfigurationManager.AppSettings.Get("BigFile.SplitFileSize")) * 1024 * 1024;
FileInfo fileInfo = new FileInfo(file);
if (fileInfo.Length > splitMinFileSizeMB)
{
Console.WriteLine("判定结果:需要分隔文件!");
}
else
{
Console.WriteLine("判定结果:不需要分隔文件!");
Console.ReadKey();
return;
}
int steps = (int)(fileInfo.Length / splitFileSize);
var length = fileInfo.Length;
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Read))
{
using (BinaryReader br = new BinaryReader(fs))
{
int couter = 1;
bool isReadingComplete = false;
while (!isReadingComplete)
{
string filePath = $"{fileInfo.FullName}.{couter}{fileInfo.Extension}";
Console.WriteLine("开始读取文件【{1}】:{0}", filePath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
byte[] input = br.ReadBytes(splitFileSize);
var newLine = GetLineFeed(br);
using (FileStream writeFs = new FileStream(filePath, FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(writeFs))
{
bw.Write(input);
bw.Write(newLine);
}
}
isReadingComplete = br.BaseStream.Position >= length;
if (!isReadingComplete)
{
couter += 1;
}
Console.WriteLine("完成读取文件【{1}】:{0}", filePath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
}
}
Console.WriteLine("分隔完成,请按下任意键结束操作。。。");
Console.ReadKey();
}
/// <summary>
/// 读取至换行\r\n
/// </summary>
/// <returns></returns>
public byte[] GetLineFeed(BinaryReader br)
{
var list = new List<byte>();
while (true)
{
try
{
var currentByte = br.ReadByte();
list.Add(currentByte);
//小端存储
if (BitConverter.IsLittleEndian)
{
if (currentByte == Return)
{
currentByte = br.ReadByte();
list.Add(currentByte);
if (currentByte == Newline)
{
break;
}
}
}
else
{
if (currentByte == Newline)
{
currentByte = br.ReadByte();
list.Add(currentByte);
if (currentByte == Return)
{
break;
}
}
}
}
catch (EndOfStreamException ex)
{
break;
}
}
return list.ToArray();
}
}
浙公网安备 33010602011771号