예제 #1
0
        /// <summary>
        ///  创建资源
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="imageFileName"></param>
        /// <param name="videoFileName"></param>
        /// <returns></returns>
        public static async Task MergeAsync(string OutputFileame, string Password, string videoFileName)
        {
            //构建头部
            string extension = System.IO.Path.GetExtension(OutputFileame);

            OutputFileame = OutputFileame.Replace(extension, "加密" + extension);

            string Header  = "@#$%#$^E$@$" + Password;
            var    protect = new ProtectInfomat()
            {
                PassWord = Header.PadRight(1024, '\0').ToBytes(),
            };
            //压缩头部
            var headerBytes = await CompressAsync(StructToBytes(protect));

            var headerSizeBytes = BitConverter.GetBytes(headerBytes.Length);

            //构建信息
            var fileInformatSize = Marshal.SizeOf(typeof(FileStruct));
            var videoInfo        = new FileInfo(videoFileName);
            //更新位置信息
            var Offset = 4 + headerBytes.Length + fileInformatSize;

            using (var stream = File.OpenWrite(OutputFileame))
            {
                //将头部写入流
                await stream.WriteAsync(headerSizeBytes, 0, 4);

                await stream.WriteAsync(headerBytes, 0, headerBytes.Length);

                //获取流开始位置及大小
                var PosInformat = new FileStruct
                {
                    OffsetBytes = BitConverter.GetBytes((long)Offset),
                    LengthBytes = BitConverter.GetBytes(videoInfo.Length)
                };
                //分配空间
                var imageInformatBytes = StructToBytes(PosInformat);
                await stream.WriteAsync(imageInformatBytes, 0, imageInformatBytes.Length);

                using (var videoStream = videoInfo.Open(FileMode.Open))
                {
                    await videoStream.CopyToAsync(stream);
                }
            }
        }
예제 #2
0
 //public static long MaterialId(this ProtectInfomat infomat)
 //{
 //    return BitConverter.ToInt64(infomat.MaterialIdBytes, 0);
 //}
 public static string PassWord(this ProtectInfomat infomat)
 {
     return(infomat.PassWord.ToStr());
 }
예제 #3
0
 public static string Descript(this ProtectInfomat infomat)
 {
     return(infomat.DescriptBytes.ToStr());
 }
예제 #4
0
 public static string UserId(this ProtectInfomat infomat)
 {
     return(infomat.UserIdBytes.ToStr());
 }
예제 #5
0
 public static string TypeName(this ProtectInfomat infomat)
 {
     return(infomat.TypeNameBytes.ToStr());
 }
예제 #6
0
 public static long MaterialId(this ProtectInfomat infomat)
 {
     return(BitConverter.ToInt64(infomat.MaterialIdBytes, 0));
 }
예제 #7
0
        public static async Task <string> BuilderProtectAsync(
            string folder, string descript, string userId, string typename,
            long materialId)
        {
            var protect = new ProtectInfomat()
            {
                DescriptBytes   = descript.PadRight(30, '\0').ToBytes(),
                UserIdBytes     = userId.PadRight(80, '\0').ToBytes(),
                TypeNameBytes   = typename.PadRight(10, '\0').ToBytes(),
                MaterialIdBytes = longToBytes(materialId)
            };

            var headerBytes = await CompressAsync(StructToBytes(protect));

            var headerSizeBytes = BitConverter.GetBytes(headerBytes.Length);

            var fileInformatSize = Marshal.SizeOf(typeof(FileInformat));

            var imageInfo = new FileInfo($"{folder}\\Image.png");
            var videoInfo = new FileInfo($"{folder}\\Video.dat");

            var imageOffset = 4 + headerBytes.Length + fileInformatSize * 2;
            var videoOffset = imageOffset + imageInfo.Length;

            var builderFilename = $"{folder}\\Protect";

            using (var stream = File.OpenWrite(builderFilename))
            {
                await stream.WriteAsync(headerSizeBytes, 0, 4);

                await stream.WriteAsync(headerBytes, 0, headerBytes.Length);

                var imageInformat = new FileStruct
                {
                    OffsetBytes = BitConverter.GetBytes((long)imageOffset),
                    LengthBytes = BitConverter.GetBytes((long)imageInfo.Length)
                };

                var imageInformatBytes = StructToBytes(imageInformat);

                await stream.WriteAsync(imageInformatBytes, 0, imageInformatBytes.Length);

                var videoInformat = new FileStruct
                {
                    OffsetBytes = BitConverter.GetBytes((long)videoOffset),
                    LengthBytes = BitConverter.GetBytes((long)videoInfo.Length)
                };

                var videoInformatBytes = StructToBytes(videoInformat);

                await stream.WriteAsync(videoInformatBytes, 0, videoInformatBytes.Length);

                using (var imageStream = imageInfo.Open(FileMode.Open))
                {
                    await imageStream.CopyToAsync(stream);
                }

                using (var videoStream = videoInfo.Open(FileMode.Open))
                {
                    await videoStream.CopyToAsync(stream);
                }
            }

            return(builderFilename);
        }
예제 #8
0
        /// <summary>
        ///  创建资源
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="imageFileName"></param>
        /// <param name="videoFileName"></param>
        /// <param name="informat"></param>
        /// <returns></returns>
        public static async Task MergeAsync(string filename, string imageFileName, string videoFileName, FileInformat informat)
        {
            //构建头部
            var protect = new ProtectInfomat()
            {
                DescriptBytes = informat.DescriptBytes,
                UserIdBytes   = informat.UserIdBytes,
                TypeNameBytes = informat.TypeNameBytes,
                // MaterialIdBytes = longToBytes(informat.MaterialIdBytes)
            };
            //压缩头部
            var headerBytes = await CompressAsync(StructToBytes(protect));

            var headerSizeBytes = BitConverter.GetBytes(headerBytes.Length);

            //构建图片流信息
            var fileInformatSize = Marshal.SizeOf(typeof(FileStruct));
            var imageInfo        = new FileInfo(imageFileName);
            var videoInfo        = new FileInfo(videoFileName);
            //更新 位置信息
            var imageOffset = 4 + headerBytes.Length + fileInformatSize * 2;
            var videoOffset = imageOffset + imageInfo.Length;

            using (var stream = File.OpenWrite(filename))
            {
                //将头部写入流
                await stream.WriteAsync(headerSizeBytes, 0, 4);

                await stream.WriteAsync(headerBytes, 0, headerBytes.Length);

                //分析图片流位置及大小
                var imageInformat = new FileStruct
                {
                    OffsetBytes = BitConverter.GetBytes((long)imageOffset),
                    LengthBytes = BitConverter.GetBytes(imageInfo.Length)
                };
                //为图片流分配空间
                var imageInformatBytes = StructToBytes(imageInformat);
                await stream.WriteAsync(imageInformatBytes, 0, imageInformatBytes.Length);

                //分析视频流位置及大小
                var videoInformat = new FileStruct
                {
                    OffsetBytes = BitConverter.GetBytes((long)videoOffset),
                    LengthBytes = BitConverter.GetBytes(videoInfo.Length)
                };
                //为视频流分配空间
                var videoInformatBytes = StructToBytes(videoInformat);
                await stream.WriteAsync(videoInformatBytes, 0, videoInformatBytes.Length);

                #region 往分配的空间中写入流
                using (var imageStream = imageInfo.Open(FileMode.Open))
                {
                    await imageStream.CopyToAsync(stream);
                }

                using (var videoStream = videoInfo.Open(FileMode.Open))
                {
                    await videoStream.CopyToAsync(stream);
                }
                #endregion
            }
        }