Ejemplo n.º 1
0
        // 传入MemoryMappedViewAccessor,加密,解密
        private int EncryptDecrypt3(object arg0)// MemoryMappedViewAccessor accessor, Int64 size)
        {
            MemoryMappedViewAccessor accessor;
            Int64         size;
            exe_to_thread et = (exe_to_thread)arg0;

            accessor = et.accessor;
            size     = et.size;
            //写入文件源数据
            int readCount = 0;

            //每次读16个字节为一次加密分组
            byte[] buffer = new byte[1024];
            Int64  pos    = 0;

            Console.WriteLine("文件线程编号:" + et.ft_threadnum.ToString() + "。处理线程编号:" + et.et_threadnum.ToString());
            while ((size - pos) > 0)
            {
                byte[] temp = null;
                // 剩余的字节数大于1024
                if ((size - pos) > buffer.Length)
                {
                    for (int index = 0; index < buffer.Length; index++)
                    {
                        buffer[index] = accessor.ReadByte(pos + index);
                    }
                    temp = buffer;
                }
                else
                {
                    for (int index = 0; index < size - pos; index++)
                    {
                        buffer[index] = accessor.ReadByte(pos + index);
                        readCount++;
                    }
                    temp = new byte[readCount];
                    Buffer.BlockCopy(buffer, 0, temp, 0, readCount);
                }
                if (flag) // 加密
                {
                    temp = sM4Utils.encryptECB(secruitKey, false, temp);
                }
                else // 解密
                {
                    temp = sM4Utils.decryptECB(secruitKey, false, temp);
                }

                for (int i = 0; i < temp.Length; i++)
                {
                    accessor.Write(pos + i, ref temp[i]);
                }

                pos += temp.Length;
            }
            Console.WriteLine("文件线程编号:" + et.ft_threadnum.ToString() + "。处理线程编号:" + et.et_threadnum.ToString() + "处理完成");
            //accessor.Dispose();
            et.accessor.Dispose();

            return(et.et_threadnum);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 引用内存映射文件
        /// </summary>
        /// <summary>
        /// 用于访问内存映射文件的存取对象
        /// </summary>
        /// <summary>
        /// 创建内存映射文件
        /// </summary>
        private int CreateMemoryMapFile(object arg0)//(string srcFile, int num)
        {
            MemoryMappedFile memoryFile = null;
            //MemoryMappedViewAccessor accessor1;// accessor;
            file_to_thread ft      = (file_to_thread)arg0;
            string         srcFile = ft.filename;

            try
            {
                FileInfo fi = new FileInfo(srcFile);  // 单位:字节
                // total size in bytes
                Int64 size     = fi.Length;
                Int64 minSize  = 1024 * 1024 * 100;
                Int64 minSize2 = 1024 * 1024 * 400;
                Int64 maxSize  = 1024 * 1024 * 100;
                currentFileName = "正在处理第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) + ",文件大小:" +
                                  size / 1024 / 1024 + "MB";
                bw.ReportProgress(ft.filenum);

                Console.WriteLine("处理的文件:" + srcFile + "。文件序号:" + ft.filenum.ToString() + "。文件线程编号:" +
                                  ft.threadnum.ToString() + "。文件大小:" + size);
                //Int64 proSize = 0;
                //Int64 fileToRead = size;//文件总的大小

                memoryFile = MemoryMappedFile.CreateFromFile(srcFile, FileMode.Open, "fileencrypt" + ft.filenum.ToString(), size);
                // 四个线程处理,平均分成四份
                if (size <= minSize)
                {
                    exe_to_thread et;
                    et.accessor     = memoryFile.CreateViewAccessor(0, size);
                    et.ft_threadnum = ft.threadnum;
                    et.size         = size;
                    et.et_threadnum = 0;

                    var result = Task.Run(() => EncryptDecrypt0(et));
                    Console.WriteLine("主线程不会阻塞,它会继续执行");
                    Console.WriteLine("子任务的返回值分别为:{0}", result.Result);
                    currentFileName = "第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) +
                                      ",文件大小:" + size / 1024 / 1024 + "MB,当前进度:" + 100 + "%";
                    bw.ReportProgress(ft.filenum);
                    et.accessor.Dispose();
                }
                else if (size > minSize && size <= minSize2)
                {
                    Int64           proSize = size / 4;
                    exe_to_thread[] ets     = new exe_to_thread[4];
                    ets[0].accessor     = memoryFile.CreateViewAccessor(0, proSize);
                    ets[1].accessor     = memoryFile.CreateViewAccessor(proSize, proSize);
                    ets[2].accessor     = memoryFile.CreateViewAccessor(2 * proSize, proSize);
                    ets[3].accessor     = memoryFile.CreateViewAccessor(3 * proSize, size - 3 * proSize);
                    ets[0].ft_threadnum = ft.threadnum;
                    ets[0].et_threadnum = 0;
                    ets[0].size         = proSize;
                    ets[1].ft_threadnum = ft.threadnum;
                    ets[1].et_threadnum = 1;
                    ets[1].size         = proSize;
                    ets[2].ft_threadnum = ft.threadnum;
                    ets[2].et_threadnum = 2;
                    ets[2].size         = proSize;
                    ets[3].ft_threadnum = ft.threadnum;
                    ets[3].et_threadnum = 3;
                    ets[3].size         = size - 3 * proSize;
                    var parentTask = new Task <int[]>(() =>
                    {
                        //开启多个子任务
                        var results = new int[4];

                        //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行
                        //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题
                        new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start();
                        new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start();
                        new Task(() => results[2] = EncryptDecrypt2(ets[2]), TaskCreationOptions.AttachedToParent).Start();
                        new Task(() => results[3] = EncryptDecrypt3(ets[3]), TaskCreationOptions.AttachedToParent).Start();
                        return(results);
                    });
                    parentTask.Start();

                    Console.WriteLine("主线程不会阻塞,它会继续执行");
                    foreach (var re in parentTask.Result)
                    {
                        Console.WriteLine("子任务的返回值分别为:{0}", re);
                    }

                    currentFileName = "第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) +
                                      ",文件大小:" + size / 1024 / 1024 + "MB,当前进度:" + 100 + "%";
                    bw.ReportProgress(ft.filenum);

                    ets[0].accessor.Dispose();
                    ets[1].accessor.Dispose();
                    ets[2].accessor.Dispose();
                    ets[3].accessor.Dispose();
                }
                else
                {
                    Int64 total_count = size / maxSize;
                    if (size % maxSize != 0)
                    {
                        total_count++;
                    }
                    Int64 counts     = 0;
                    Int64 remainSize = size;

                    // 同时分配的不超过500MB,每次分配100M
                    while ((total_count - counts) > 0)
                    {
                        Int64 temp_count;
                        Int64 temp_size = 0;;
                        if ((total_count - counts) >= 4)
                        {
                            temp_count = 4;
                        }
                        else
                        {
                            temp_count = (total_count - counts);
                        }
                        exe_to_thread[] ets = new exe_to_thread[temp_count];
                        if (temp_count == 4)
                        {
                            ets[0].accessor = memoryFile.CreateViewAccessor(counts * maxSize, maxSize);
                            ets[1].accessor = memoryFile.CreateViewAccessor((counts + 1) * maxSize, maxSize);
                            ets[2].accessor = memoryFile.CreateViewAccessor((counts + 2) * maxSize, maxSize);
                            if ((remainSize - 3 * maxSize) >= maxSize)
                            {
                                temp_size = maxSize;
                            }
                            else
                            {
                                temp_size = remainSize - 3 * maxSize;
                            }
                            ets[3].accessor     = memoryFile.CreateViewAccessor((counts + 3) * maxSize, temp_size);
                            ets[0].ft_threadnum = ft.threadnum;
                            ets[0].et_threadnum = 0;
                            ets[0].size         = maxSize;
                            ets[1].ft_threadnum = ft.threadnum;
                            ets[1].et_threadnum = 1;
                            ets[1].size         = maxSize;
                            ets[2].ft_threadnum = ft.threadnum;
                            ets[2].et_threadnum = 2;
                            ets[2].size         = maxSize;
                            ets[3].ft_threadnum = ft.threadnum;
                            ets[3].et_threadnum = 3;
                            ets[3].size         = temp_size;
                            var parentTask = new Task <int[]>(() =>
                            {
                                //开启多个子任务
                                var results = new int[temp_count];

                                //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行
                                //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题
                                new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start();
                                new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start();
                                new Task(() => results[2] = EncryptDecrypt2(ets[2]), TaskCreationOptions.AttachedToParent).Start();
                                new Task(() => results[3] = EncryptDecrypt3(ets[3]), TaskCreationOptions.AttachedToParent).Start();
                                return(results);
                            });
                            parentTask.Start();

                            Console.WriteLine("主线程不会阻塞,它会继续执行");
                            foreach (var re in parentTask.Result)
                            {
                                Console.WriteLine("子任务的返回值分别为:{0}", re);
                            }
                            ets[0].accessor.Dispose();
                            ets[1].accessor.Dispose();
                            ets[2].accessor.Dispose();
                            ets[3].accessor.Dispose();
                        }
                        else if (temp_count == 3)
                        {
                            ets[0].accessor = memoryFile.CreateViewAccessor(counts * maxSize, maxSize);
                            ets[1].accessor = memoryFile.CreateViewAccessor((counts + 1) * maxSize, maxSize);
                            if ((remainSize - 2 * maxSize) >= maxSize)
                            {
                                temp_size = maxSize;
                            }
                            else
                            {
                                temp_size = remainSize - 2 * maxSize;
                            }
                            ets[2].accessor     = memoryFile.CreateViewAccessor((counts + 2) * maxSize, temp_size);
                            ets[0].ft_threadnum = ft.threadnum;
                            ets[0].et_threadnum = 0;
                            ets[0].size         = maxSize;
                            ets[1].ft_threadnum = ft.threadnum;
                            ets[1].et_threadnum = 1;
                            ets[1].size         = maxSize;
                            ets[2].ft_threadnum = ft.threadnum;
                            ets[2].et_threadnum = 2;
                            ets[2].size         = temp_size;
                            var parentTask = new Task <int[]>(() =>
                            {
                                //开启多个子任务
                                var results = new int[temp_count];

                                //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行
                                //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题
                                new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start();
                                new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start();
                                new Task(() => results[2] = EncryptDecrypt2(ets[2]), TaskCreationOptions.AttachedToParent).Start();
                                return(results);
                            });
                            parentTask.Start();

                            Console.WriteLine("主线程不会阻塞,它会继续执行");
                            foreach (var re in parentTask.Result)
                            {
                                Console.WriteLine("子任务的返回值分别为:{0}", re);
                            }

                            ets[0].accessor.Dispose();
                            ets[1].accessor.Dispose();
                            ets[2].accessor.Dispose();
                        }
                        else if (temp_count == 2)
                        {
                            ets[0].accessor = memoryFile.CreateViewAccessor(counts * maxSize, maxSize);
                            if ((remainSize - maxSize) >= maxSize)
                            {
                                temp_size = maxSize;
                            }
                            else
                            {
                                temp_size = remainSize - maxSize;
                            }
                            ets[1].accessor     = memoryFile.CreateViewAccessor((counts + 1) * maxSize, temp_size);
                            ets[0].ft_threadnum = ft.threadnum;
                            ets[0].et_threadnum = 0;
                            ets[0].size         = maxSize;
                            ets[1].ft_threadnum = ft.threadnum;
                            ets[1].et_threadnum = 1;
                            ets[1].size         = temp_size;
                            var parentTask = new Task <int[]>(() =>
                            {
                                //开启多个子任务
                                var results = new int[temp_count];

                                //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行
                                //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题
                                new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start();
                                new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start();
                                return(results);
                            });
                            parentTask.Start();

                            Console.WriteLine("主线程不会阻塞,它会继续执行");
                            foreach (var re in parentTask.Result)
                            {
                                Console.WriteLine("子任务的返回值分别为:{0}", re);
                            }
                            ets[0].accessor.Dispose();
                            ets[1].accessor.Dispose();
                        }
                        else if (temp_count == 1)
                        {
                            if ((remainSize - maxSize) >= maxSize)
                            {
                                temp_size = maxSize;
                            }
                            else
                            {
                                temp_size = remainSize;// - maxSize;
                            }
                            ets[0].accessor     = memoryFile.CreateViewAccessor(counts * maxSize, temp_size);
                            ets[0].ft_threadnum = ft.threadnum;
                            ets[0].et_threadnum = 0;
                            ets[0].size         = temp_size;
                            var parentTask = new Task <int[]>(() =>
                            {
                                //开启多个子任务
                                var results = new int[temp_count];

                                //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行
                                //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题
                                new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start();
                                return(results);
                            });
                            parentTask.Start();

                            Console.WriteLine("主线程不会阻塞,它会继续执行");
                            foreach (var re in parentTask.Result)
                            {
                                Console.WriteLine("子任务的返回值分别为:{0}", re);
                            }
                            ets[0].accessor.Dispose();
                        }
                        remainSize      = remainSize - (temp_count - 1) * maxSize - temp_size;
                        currentFileName = "第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) +
                                          ",文件大小:" + size / 1024 / 1024 + "MB,当前进度:" + (size - remainSize) * 100 / size + "%";;
                        bw.ReportProgress(ft.filenum);
                        counts += temp_count;
                    }
                }

                Console.WriteLine("文件:" + srcFile + "处理完成");
                memoryFile.Dispose();
            }
            catch (Exception ex)
            {
                throw;
            }

            return(ft.threadnum);
        }