## 关于文件分割与合并
概要说明
关于文件分割和合并的方法网上有很多 ,但是我写的时候 这个方法的时候,网上的方法可能不太适用或者没有把文件分割和合并的要注意的点没有说出来
注意事项:如果一个文件,已每片1kb分的话读取的时候一定要注意流的位置否则合并之后会导致文件损坏,导致图片打不开或显示不全,视频播放不了等问题
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace 测试文件分割合并
{
class Program
{
static void Main(string[] args)
{
var str = @"E:\Utilts\TestFileSplit\1.pdf";
var str1 = @"E:\Utilts\TestFileSplit\Test2\";
var str2 = @"E:\Utilts\TestFileSplit\Test2\";
var str3 = @"E:\Utilts\TestFileSplit\target\";
//分割文件
var msg = FileSplit(str, str1,1024);
//合并文件
MergeFileAttr(str2, str3, 1024);
//计算文件大小
var len = MergeFileSize(str1, 1024);
Console.WriteLine(len);
}
#region 文件分割
public static string FileSplit(string filePath, string path, long SplitFileSize)
{
Console.WriteLine("正在分解文件:" + System.IO.Path.GetFileName(filePath) + "请稍候......");
var flag = string.Empty;
if (string.IsNullOrEmpty(filePath))
{
flag = "文件路径不能为空";
}
if (string.IsNullOrEmpty(path))
{
flag = "目标路径不能为空";
}
long readLocation = 0;
Stream stream = File.OpenRead(filePath);
byte[] by = new byte[SplitFileSize];
string item = "0";
try
{
BufferedStream buffered = new BufferedStream(stream, 1024);
BinaryReader reader = new BinaryReader(buffered);
long len = reader.BaseStream.Length;
var loopSize = (Convert.ToInt32(Math.Ceiling((double)stream.Length / by.Length)));
for (int i = 0; i < loopSize; i++)
{
if ((i + 1).ToString().Length == 1)
{
item = "00";
}
else if ((i + 1).ToString().Length == 2)
{
item = "0";
}
else
{
item = string.Empty;
}
reader.BaseStream.Seek(readLocation, SeekOrigin.Begin);
by = reader.ReadBytes(by.Length);
using (BinaryWriter writer = new BinaryWriter(File.Open(path + @"\" + System.IO.Path.GetFileName(filePath) + "." + ((i + 1).ToString()), FileMode.Create)))
{
writer.Write(by);
writer.Flush();
}
readLocation = (by.Length) * (i + 1);
}
flag = "文件分割成功";
}
catch (Exception ex)
{
flag = "文件分割失败";
}
Console.WriteLine("文件分解完成");
return flag;
}
#endregion
#region 文件合并
/// <summary>
/// 文件合并
/// </summary>
/// <param name="path">文件组集合路径</param>
/// <param name="targetPath">合并之后的保存路径</param>
/// <param name="SplitFileSize">已多大字节去合并</param>
public static void MergeFileAttr(string path, string targetPath, long SplitFileSize)
{
int z = 0;
Console.WriteLine("正在合并文件:请稍候......");
byte[] by = new byte[SplitFileSize];
DirectoryInfo directory = new DirectoryInfo(path);
//获取路径下的分割文件集合
FileInfo[] fileInfos = directory.GetFiles();
//文件进行排序的集合
ArrayList array=SortAsFileName(path);
foreach (FileInfo item in fileInfos)
{
var lastLen = item.FullName.LastIndexOf(".");
var fileFullName=item.FullName.Substring(0, item.FullName.Length-(item.FullName.Length - lastLen)) + "." + array[z];
z += 1;
using (BufferedStream buffered = new BufferedStream(File.OpenRead(fileFullName)))
{
using (BinaryReader stream = new BinaryReader(buffered))
{
using (BinaryWriter writer = new BinaryWriter(File.Open(targetPath + @"\" + "merge.pdf", FileMode.Append)))
{
if (stream.BaseStream.Length != SplitFileSize)
{
byte[] temp = new byte[stream.BaseStream.Length];
stream.BaseStream.Read(temp, 0, temp.Length);
writer.Write(temp);
}
else
{
stream.BaseStream.Read(by, 0, by.Length);
writer.Write(by);
}
}
}
}
}
Console.WriteLine("文件合并完成");
}
#endregion
#region 计算分割文件大小
public static long MergeFileSize(string path, int size)
{
long len = 0;
DirectoryInfo directory = new DirectoryInfo(path);
//获取路径下的分割文件集合
FileInfo[] fileInfos = directory.GetFiles();
foreach (FileInfo item in fileInfos)
{
len += item.Length;
}
return len;
}
#endregion
#region 对文件列表进行排序
/// <summary>
/// 对文件列表进行排序
/// </summary>
/// <param name="arrFi"></param>
private static ArrayList SortAsFileName(string path)
{
ArrayList list = new ArrayList();
DirectoryInfo directory = new DirectoryInfo(path);
//获取路径下的分割文件集合
FileInfo[] fileInfos = directory.GetFiles();
foreach (var item in fileInfos)
{
var len = System.IO.Path.GetFileName(item.FullName).LastIndexOf(".");
var totalSize = System.IO.Path.GetFileName(item.FullName);
var res = int.Parse(totalSize.Substring(len + 1, totalSize.Length - len - 1));
list.Add(res);
}
list.Sort();
return list;
}
#endregion
}
}
1223



被折叠的 条评论
为什么被折叠?



