[轉] C#文件的分割與合並


        //--------------------文件,分割與合並---------------------------------------- using System.IO
        /// <summary>
        /// 單個文件分割函數,
        /// 可將任意文件fileIn分割為若干個子文件, 單個子文件最大為 len KB
        /// delet標識文件分割完成后是否刪除原文件, change為加密密匙
        /// fileIn = "D:\\file.rar", 子文件名形如"D:\\file.rar@_1.split"
        /// </summary>
        public void fileSplit(String fileIn, int KBlen, bool delet, int change)
        {
            //輸入文件校驗
            if (fileIn == null || !System.IO.File.Exists(fileIn))
            {
                MessageBox.Show("文件" + fileIn + "不存在!");
                return;
            }

            //加密初始化
            short sign = 1;
            int num = 0, tmp;
            if (change < 0) { sign = -1; change = -change; }

            //取文件名和后綴, fileIn = "D:\\1.rar"

            //從文件創建輸入流
            FileStream FileIn = new FileStream(fileIn, FileMode.Open);
            byte[] data = new byte[1024];   //流讀取,緩存空間
            int len = 0, I = 1;             //記錄子文件累積讀取的KB大小, 分割的子文件序號

            FileStream FileOut = null;      //輸出流
            int readLen = 0;                //每次實際讀取的字節大小
            while (readLen > 0 || (readLen = FileIn.Read(data, 0, data.Length)) > 0) //讀取數據
            {
                //創建分割后的子文件,已有則覆蓋,子文件"D:\\1.rar@_1.split"
                if (len == 0) FileOut = new FileStream(fileIn + "@_" + I++ + ".split", FileMode.Create);

                //加密邏輯,對data的首字節進行邏輯偏移加密
                if (num == 0) num = change;
                tmp = data[0] + sign * (num % 3 + 3);
                if (tmp > 255) tmp -= 255;
                else if (tmp < 0) tmp += 255;
                data[0] = (byte)tmp;
                num /= 3;

                //輸出,緩存數據寫入子文件
                FileOut.Write(data, 0, readLen);
                FileOut.Flush();

                //預讀下一輪緩存數據
                readLen = FileIn.Read(data, 0, data.Length);
                if (++len >= KBlen || readLen == 0)     //子文件達到指定大小,或文件已讀完
                {
                    FileOut.Close();                    //關閉當前輸出流
                    len = 0;
                }
            }

            FileIn.Close();                             //關閉輸入流
            if (delet) System.IO.File.Delete(fileIn);   //刪除源文件
        }
        /// <summary>
        /// 對多個文件進行分割操作
        /// </summary>
        public void fileSplit(String[] fileIn, int KBlen, bool delet, int change)
        {
            if (fileIn == null || fileIn.Length == 0) return;

            for (int i = 0; i < fileIn.Length; i++)
                fileSplit(fileIn[i], KBlen, delet, change);
            MessageBox.Show("文件分割完成!");
        }
        /// <summary>
        /// 文件合並函數,
        /// 可將任意個子文件合並為一個,為fileSplit()的逆過程
        /// delet標識是否刪除原文件, change對data的首字節進行解密
        /// </summary>
        public void fileCombine(String[] fileIn, bool delet, int change)
        {
            //輸入文件名校驗
            if (fileIn == null || fileIn.Length == 0) return;

            //加密初始化
            short sign = 1;
            int num = 0, tmp;
            if (change < 0) { sign = -1; change = -change; }

            //從首個子文件解析原文件名, fileIn[0] = "D:\\1.rar@_1.split"
            
            string name = fileIn[0];
            int i1 = name.LastIndexOf("@_"), i2 = name.LastIndexOf('.');
            name = name.Substring(0, i2);                                   //剔除子文件拓展名".split"
            string fileOut = (i1 == -1) ? name : name.Remove(i1, i2 - i1);  //剔除"@_1" -> "D:\\1.rar.split"                      

            //創建輸出文件,已有則覆蓋
            FileStream FileOut = new FileStream(fileOut, FileMode.Create);

            for (int i = 0; i < fileIn.Length; i++)
            {
                //輸入文件校驗
                if (fileIn[i] == null || !System.IO.File.Exists(fileIn[i])) continue;

                //從子文件創建輸入流
                FileStream FileIn = new FileStream(fileIn[i], FileMode.Open);
                byte[] data = new byte[1024];   //流讀取,緩存空間
                int readLen = 0;                //每次實際讀取的字節大小

                while ((readLen = FileIn.Read(data, 0, data.Length)) > 0)       //讀取數據
                {
                    //解密邏輯,對data的首字節進行邏輯偏移解密
                    if (num == 0) num = change;
                    tmp = data[0] + sign * (num % 3 + 3);
                    if (tmp > 255) tmp -= 255;
                    else if (tmp < 0) tmp += 255;
                    data[0] = (byte)tmp;
                    num /= 3;

                    //輸出,緩存數據寫入文件
                    FileOut.Write(data, 0, readLen);
                    FileOut.Flush();
                }

                //關閉輸入流,刪除源文件
                FileIn.Close();
                if (delet) System.IO.File.Delete(fileIn[i]);
            }

            FileOut.Close();    //關閉輸出流
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM