|
using System;
using System.IO;
using System.Collections;
namespace Laodeng.IO
{
/// <summary>
/// 文件分割类
/// </summary>
public class Spliter
{
public Spliter()
{
}
#region 变量成员
private string splitExtension = ".ld";
/// <summary>
/// 得到或设置分割后的文件后缀
/// </summary>
public string SplitExtension
{
get
{
return splitExtension;
}
set
{
splitExtension = value;
}
}
#endregion
#region 分割文件
/// <summary>
/// 分割文件
/// </summary>
/// <param name="FileName">分割的文件全名</param>
/// <param name="Size">分割的文件大小</param>
/// <param name="SavePath">分割块的保存路径</param>
public void Split(string FileName, int Size, string SavePath)
{
if (FileName != null && FileName != "")
{
if (Size > 0)
{
Stream stream = null;
BinaryReader reader = null;
try
{
int length = 1;
int i = 1;
stream = new FileStream(FileName, FileMode.Open);
reader = new BinaryReader(stream);
byte[] buffer = new byte[Size];
length = reader.Read(buffer, 0, Size);
while (length != 0)
{
SaveFile(buffer, 0, length, System.IO.Path.Combine(SavePath, System.IO.Path.GetFileName(FileName) + SplitExtension + i.ToString()));
length = reader.Read(buffer, 0, Size);
i++;
}
}
finally
{
reader.Close();
stream.Close();
}
}
else
{
throw new Exception("请输入要进行分割的文件块大小。");
}
}
else
{
throw new Exception("请选择您要进行分割的文件!");
}
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="buffer">数据缓冲区</param>
/// <param name="index">开始位置</param>
/// <param name="Length">长度</param>
/// <param name="FileName">文件名</param>
private void SaveFile(byte[] buffer, int index, int Length, string FileName)
{
Stream stream = new FileStream(FileName, FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(buffer, index, Length);
writer.Close();
stream.Close();
}
#endregion
#region 合并文件
/// <summary>
/// 合并文件
/// </summary>
/// <param name="UniteFileName">要合并的文件块</param>
/// <param name="SavePath">保存的路径</param>
/// <param name="NewFileName">新的文件名</param>
public void Unite(string UniteFileName, string SavePath, string NewFileName)
{
if (UniteFileName != null && UniteFileName != "")
{
//
// 中间变量定义
//
int length = 0;
string Key = "";
string Extentsion = "";
string FormerlyName = "";
object TestFileName = null;
string FilePath = Path.GetDirectoryName(UniteFileName);
int ExtensionLength = SplitExtension.Length;
int FileLength = (int)new System.IO.FileInfo(UniteFileName).Length;
byte[] buffer = new byte[FileLength];
FormerlyName = Path.GetFileNameWithoutExtension(UniteFileName);
string[] FileList = Directory.GetFiles(FilePath, FormerlyName + SplitExtension + "*");
SortedList sort = new SortedList(FileList.Length);
//
// 添加到SortedList中
//
foreach (string fname in FileList)
{
Extentsion = Path.GetExtension(fname);
Key = Extentsion.Substring(ExtensionLength, Extentsion.Length - ExtensionLength);
sort.Add(Key, fname);
}
//
// 如果没有手动选择保存文件的目录
// 则把它保存在与文件块所在目录中
//
if (NewFileName == null || NewFileName == "")
{
NewFileName = FormerlyName;
}
if (SavePath == null || SavePath == "")
{
SavePath = System.IO.Path.GetFullPath(UniteFileName);
}
SavePath = System.IO.Path.Combine(SavePath, NewFileName);
//创建合并文件的主文件
Stream stream = null;
BinaryWriter writer = null;
try
{
stream = new FileStream(SavePath, FileMode.Create);
writer = new BinaryWriter(stream);
for (int i = 1; i <= FileList.Length; i++)//添加文件
{
TestFileName = sort[i.ToString()];
//
// 如果文件不存在则引发异常
//
if (TestFileName == null)
{
throw new Exception("文件损失!");
}
//
// 把文件块保存到主文件中去
//
Stream ReadT = new FileStream(TestFileName.ToString(), FileMode.Open);
BinaryReader Reader = new BinaryReader(ReadT);
length = Reader.Read(buffer, 0, FileLength);
if (length != 0)
{
writer.Write(buffer, 0, length);
}
Reader.Close();
ReadT.Close();
}
}
finally
{
writer.Close();
stream.Close();
}
}
else
{
throw new Exception("请选择您要合并的文件块!");
}
}
#endregion
}
} |