文件分割与合并(C# Winforms)

来源:互联网 发布:美国枪击案与网络恶搞 编辑:程序博客网 时间:2024/05/01 13:08

主要代码:

using System;using System.IO;namespace FileManager{    /// <summary>    /// 标题:文件辅助类    /// 作者:肖小勇    /// 日期:2011-08-19    /// 描述:目前包含的功能有 “文件分割”、“文件合并”    /// </summary>    public class FileHelper    {        /// <summary>        /// 单次读取文件的字节数,同时也是分割文件最小容量,默认为 0.5M        /// </summary>        const int MIN_PARTSIZE = 1024 * 1024/2;         #region " Split "        /// <summary>        /// 分割文件        /// </summary>        /// <param name="sourceFile">需要分割的文件路径</param>        /// <param name="targetFolder">文件分割后保存的目录</param>        /// <param name="singlePartSize">单个文件包的大小,单位字节</param>        public static void Split(string sourceFile, string targetFolder, int singlePartSize)        {            if (!File.Exists(sourceFile))                throw new ArgumentException("指定的源文件路径不存在");            if (!Directory.Exists(targetFolder))                Directory.CreateDirectory(targetFolder);            if (singlePartSize < MIN_PARTSIZE)                throw new ArgumentOutOfRangeException("singlePartSize", string.Format("不能小于 {0}", MIN_PARTSIZE));            var partSize = 0;            var partIndex = 0;            var partPath = Path.Combine(targetFolder, GetPartFileName(partIndex));            var partWriter = new BinaryWriter(File.Open(partPath, FileMode.Create));            try            {                using (var br = new BinaryReader(File.Open(sourceFile, FileMode.Open)))                {                    while (br.BaseStream.Position < br.BaseStream.Length)                    {                        if (partSize >= singlePartSize)                        {                            partWriter.Flush();                            partWriter.Close();                            partSize = 0;                            partIndex++;                            partPath = Path.Combine(targetFolder, string.Format("{0}.part", partIndex));                            partWriter = new BinaryWriter(File.Open(partPath, FileMode.Create));                        }                        var blance = br.BaseStream.Length - br.BaseStream.Position;                        if (blance > MIN_PARTSIZE)                        {                            partWriter.Write(br.ReadBytes(MIN_PARTSIZE));                            partSize += MIN_PARTSIZE;                        }                        else                        {                            var b = Convert.ToInt32(blance);                            partWriter.Write(br.ReadBytes(b));                            partSize += b;                        }                    }                }            }            finally            {                partWriter.Flush();                partWriter.Close();            }        }        #endregion        #region " Merge "                /// <summary>        /// 合并文件,需要合并的文件必须保存的一个文件夹下,文件名必须是连续的,第一个文件必须是 0.part        /// </summary>        /// <param name="sourceFolder">分割文件存入的文件夹</param>        /// <param name="targetFile">全并后文件存入的路径</param>        public static void Merge(string sourceFolder, string targetFile)        {            if (!Directory.Exists(sourceFolder))                throw new ArgumentException("指定的目录不存在");            var partSize = 0;            var partIndex = 0;            var partPath = Path.Combine(sourceFolder, GetPartFileName(partIndex));            if (!File.Exists(partPath))                return;            var partWriter = new BinaryWriter(File.Open(targetFile, FileMode.Create));            try            {                while (File.Exists(partPath))                {                    using (var br = new BinaryReader(File.Open(partPath, FileMode.Open)))                    {                        while (br.BaseStream.Position < br.BaseStream.Length)                        {                            var blance = br.BaseStream.Length - br.BaseStream.Position;                            if (blance > MIN_PARTSIZE)                            {                                partWriter.Write(br.ReadBytes(MIN_PARTSIZE));                                partSize += MIN_PARTSIZE;                            }                            else                            {                                var b = Convert.ToInt32(blance);                                partWriter.Write(br.ReadBytes(b));                                partSize += b;                            }                        }                    }                    partSize = 0;                    partIndex ++;                    partPath = Path.Combine(sourceFolder, GetPartFileName(partIndex));                }            }            finally            {                partWriter.Flush();                partWriter.Close();            }        }        #endregion        static string GetPartFileName(int partIndex)        {            return string.Format("{0}.part", partIndex);        }    }}

这里要注意减少读写次数能有效的提高运行效率,上面的代码通过变量 MIN_PARTSIZE 进行控制单次读定的字节数,默认值为 0.5 M。

源代码下载地址:http://download.csdn.net/source/3531898

原创粉丝点击