用户ID :  密码 : 

登 录

注 册

时代财富科技公司 FortuneAge Technology Co., Ltd. 校园博客客服网站(新)

我的资料

laodeng

博客信息

积分:36
等级:0级 lv 0
日志总数:12
发表评论总数:0 (查看)
获得评论总数:0
发表留言总数:0
浏览总数:4535

最新公告

暂无公告

最新相册

我的日历

最新评论

RSS

首页 -> 8小时之外->文件分割类
文件分割类

 

这个源于网友的一个疑问,他希望把一个.bmp文件进行分割。

Spliter

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

 

    }

}

这个类,分割后的文件会有多个类似xxx.ld1 xxx.ld2....xxx.ldn这样的文件块。合并时,只要选择xxx.ld1就可以了,程序会自动加载需要的文件块进行合并操作。

 

网友评论

共 0 页,0 条记录  

用户名:
密码:
您的评论:
正在载入编辑器...


发 表 评 论