Exemple #1
0
        /// <summary>
        /// 获取压缩过的文件
        /// </summary>
        /// <param name="filePaths">文件路径数组</param>
        /// <param name="isDeleteFiles">是否删除源文件</param>
        /// <param name="password">压缩密码</param>
        public static async Task <byte[]> GetFileOfZipAsync(string[] filePaths, bool isDeleteFiles = false, string password = null)
        {
            try
            {
                if (filePaths?.Length > 0)
                {
                    using var stream    = new MemoryStream();
                    using var zipStream = new ZipOutputStream(stream);

                    if (password.IsNotNullOrEmpty())
                    {
                        zipStream.Password = password;
                    }

                    zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
                    foreach (string file in filePaths)
                    {
                        using var fs = File.OpenRead(file);
                        var entry = new ZipEntry(Path.GetFileName(file))
                        {
                            Size = fs.Length, IsUnicodeText = true
                        };
                        //Setting the Size provides WinXP built-in extractor compatibility,
                        //but if not available, you can set zipOutputStream.UseZip64 = UseZip64.Off instead.
                        zipStream.PutNextEntry(entry);
                        var buffer = new byte[4096];
                        var count  = 0;
                        while ((count = await fs.ReadAsync(buffer, 0, buffer.Length)) != 0)
                        {
                            await zipStream.WriteAsync(buffer, 0, count);

                            await zipStream.FlushAsync();
                        }
                    }
                    zipStream.Finish();
                    return(stream.ToArray());
                }
                return(null);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                //删除文件
                if (isDeleteFiles)
                {
                    foreach (var file in filePaths)
                    {
                        if (File.Exists(file))
                        {
                            File.Delete(file);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 打包下载文件,返回压缩包地址
        /// </summary>
        /// <param name="filePaths">要下载的文件路径</param>
        /// <param name="accountKey">Azure连接字符串</param>
        /// <param name="path">压缩包的存储路径</param>
        /// <returns></returns>
        public static async Task <string> DownloadZIPFilesAsync(List <string> filePaths, string accountKey, string path)
        {
            try
            {
                path = BlobHelper.GetPath(path);
                var containerName = path;
                var blobName      = DateTime.Now.ToString("yyyyMMdd");
                if (path.Contains("/"))
                {
                    containerName = path.Split('/')[0];
                    blobName      = path.Substring(path.IndexOf('/') + 1) + "/" + blobName;
                }
                ///Azure连接串
                var container = await BlobHelper.GetBlobContainer(accountKey.GetConnectionString(), containerName);

                ///打包文件地址
                var zipPath = $"{blobName}/ZipFile/{Guid.NewGuid().ToString("N")}.zip";
                ///打包文件的Azure块
                var zipBlockBlob = container.GetBlockBlobReference(zipPath);

                using (var blobStream = await zipBlockBlob.OpenWriteAsync())
                {   ///读取压缩包的流
                    using (ZipOutputStream zipStream = new ZipOutputStream(blobStream))
                    {
                        ///循环要下载的文件地址
                        foreach (var file in filePaths)
                        {
                            ///获取排除https头的文件地址
                            var filePath = file.Substring(file.IndexOf(ConfigSetting.HttpHeader) + ConfigSetting.HttpHeader.Length + 1);
                            ///获取这个文件在Azure中的位置
                            var fileBlobName = filePath.Substring(filePath.IndexOf('/') + 1);
                            ///读取文件名(带后缀)
                            var fileName = file.Substring(file.LastIndexOf('/') + 1);
                            ///获取Azure中的文件
                            var fileBlockBlob = container.GetBlockBlobReference(fileBlobName);
                            using (var fileStream = await fileBlockBlob.OpenReadAsync())
                            {
                                ///文件流添加到压缩包流中
                                zipStream.PutNextEntry(new ZipEntry(fileName));
                                var buffer = new byte[fileStream.Length];
                                await fileStream.ReadAsync(buffer, 0, buffer.Length);

                                zipStream.Write(buffer, 0, buffer.Length);
                            }
                        }
                        //文件流写入
                        await zipStream.FlushAsync();
                    }
                }
                ///返回压缩包地址
                return(zipBlockBlob?.Uri.ToString());
            }
            catch (Exception ex)
            {
                return("打包下载失败," + ex.Message + ex.StackTrace);
            }
        }
Exemple #3
0
        public async Task <IImmutableList <PackageResource> > GetPackageResources(
            Components.ComponentTree components,
            string version)
        {
            var tempDir = new DirectoryInfo(Path.Combine(_path.FullName, ".tmp"));

            if (tempDir.Exists)
            {
                tempDir.Delete(true);
            }

            tempDir.Create();

            var distFolder = new DirectoryInfo(Path.Combine(_sourcePath.FullName, "dist"));

            async Task AddFilesFrom(DirectoryInfo directory, ZipOutputStream zipStream)
            {
                if (directory.FullName == tempDir.FullName)
                {
                    return;
                }

                foreach (var file in directory.GetFiles())
                {
                    zipStream.PutNextEntry(new ZipEntry(_settings.GetRelativePath(file.FullName, distFolder.FullName)));

                    await zipStream.WriteAsync(await File.ReadAllBytesAsync(file.FullName));

                    zipStream.CloseEntry();
                }

                foreach (var childDirectory in directory.GetDirectories())
                {
                    await AddFilesFrom(childDirectory, zipStream);
                }
            }

            var appFilePath = Path.Combine(tempDir.FullName, "amplify-app.zip");

            await using var zipFile   = File.Create(appFilePath);
            await using var outStream = new ZipOutputStream(zipFile);

            await AddFilesFrom(distFolder, outStream);

            await outStream.FlushAsync();

            outStream.Close();

            var result = ImmutableList.Create(new PackageResource(
                                                  _settings.GetRelativePath(Path.Combine(_path.FullName, "amplify-app.zip"), components.Path.FullName),
                                                  await File.ReadAllBytesAsync(appFilePath)));

            tempDir.Delete(true);

            return(result);
        }
        /// <summary>
        /// 执行ZIP文件创建功能
        /// </summary>
        /// <param name="Source">待压缩文件</param>
        /// <param name="NewZipPath">生成的Zip文件名</param>
        /// <param name="ZipLevel">压缩等级</param>
        /// <param name="ProgressHandler">进度通知</param>
        public static async Task CreateZipAsync(FileSystemStorageItemBase Source, string NewZipPath, int ZipLevel, ProgressChangedEventHandler ProgressHandler = null)
        {
            if (await FileSystemStorageItemBase.CreateAsync(NewZipPath, StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile)
            {
                ZipStrings.CodePage = EncodingSetting.CodePage;

                using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Exclusive).ConfigureAwait(false))
                    using (ZipOutputStream OutputStream = new ZipOutputStream(NewFileStream))
                    {
                        OutputStream.SetLevel(ZipLevel);
                        OutputStream.UseZip64      = UseZip64.Dynamic;
                        OutputStream.IsStreamOwner = false;

                        switch (Source)
                        {
                        case FileSystemStorageFile File:
                        {
                            using (FileStream FileStream = await File.GetFileStreamFromFileAsync(AccessMode.Read).ConfigureAwait(false))
                            {
                                ZipEntry NewEntry = new ZipEntry(File.Name)
                                {
                                    DateTime          = DateTime.Now,
                                    CompressionMethod = CompressionMethod.Deflated,
                                    Size = FileStream.Length
                                };

                                OutputStream.PutNextEntry(NewEntry);

                                await FileStream.CopyToAsync(OutputStream, ProgressHandler).ConfigureAwait(false);
                            }

                            break;
                        }

                        case FileSystemStorageFolder Folder:
                        {
                            await ZipFolderCore(Folder, OutputStream, Folder.Name, ProgressHandler).ConfigureAwait(false);

                            break;
                        }
                        }

                        await OutputStream.FlushAsync().ConfigureAwait(false);
                    }
            }
            else
            {
                throw new UnauthorizedAccessException();
            }
        }
        private async void button1_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedIndex == 0)
            {
                //create database backup

                SaveFileDialog sfd = new SaveFileDialog();

                sfd.Filter           = "DB Backup Files (*.db2bak)|*.db2bak";
                sfd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                sfd.FileName         = DateTime.Now.ToString("yyyyMMddHHmmssfff");

                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    ProgressDialog pgd = new ProgressDialog("Exporting Database");
                    pgd.Show(this);

                    List <string> table_names = new List <string>();

                    using (MySqlConnection sqlconn = new MySqlConnection(MCv2Persistance.Instance.Config.DatabaseConfiguration.DatabaseConnectionProperties.ConnectionString))
                    {
                        pgd.LabelText = "Opening Database Connection";

                        await sqlconn.OpenAsync();

                        pgd.Step();
                        pgd.Reset();
                        pgd.LabelText = "Retrieving Table List";

                        using (MySqlCommand cmdName = new MySqlCommand("show tables", sqlconn))
                            using (MySqlDataReader reader = cmdName.ExecuteReader())
                                while (await reader.ReadAsync())
                                {
                                    table_names.Add(reader.GetString(0));
                                }

                        pgd.Step();
                    }

                    MemoryStream[] output_streams = new MemoryStream[table_names.Count()];
                    for (int i = 0; i < table_names.Count(); i++)
                    {
                        output_streams[i] = new MemoryStream();
                    }

                    var parallelOptions = new ParallelOptions
                    {
                        MaxDegreeOfParallelism = 8
                    };

                    pgd.Reset();
                    pgd.LabelText = "Converting Tables";
                    pgd.Maximum   = table_names.Count();

                    //generate csv files for all tables in parallel and write to an in memory stream
                    Parallel.For(0, table_names.Count(), parallelOptions, async i =>
                    {
                        MemoryStream local_stream = output_streams[i];
                        StreamWriter writer       = new StreamWriter(local_stream);

                        string table_name = table_names[i];

                        List <string> column_names = new List <string>();

                        using (MySqlConnection sqlconn = new MySqlConnection(MCv2Persistance.Instance.Config.DatabaseConfiguration.DatabaseConnectionProperties.ConnectionString))
                        {
                            await sqlconn.OpenAsync();

                            using (MySqlCommand cmdName = new MySqlCommand("SHOW COLUMNS FROM `" + table_name + "`;", sqlconn))
                            {
                                //cmdName.Parameters.AddWithValue("@table_name", table_name);

                                using (MySqlDataReader reader = cmdName.ExecuteReader())
                                    while (await reader.ReadAsync())
                                    {
                                        column_names.Add(reader.GetString(0));
                                    }
                            }

                            //add names row
                            foreach (string column_name in column_names)
                            {
                                await writer.WriteAsync(column_name + (column_names.Last() == column_name ? "," : ","));
                            }

                            await writer.WriteLineAsync();

                            using (MySqlCommand cmdName = new MySqlCommand("select * from `" + table_name + "`;", sqlconn))
                            {
                                using (MySqlDataReader reader = cmdName.ExecuteReader())
                                {
                                    MethodInfo genericFunction = reader.GetType().GetMethod("GetFieldValue");

                                    while (await reader.ReadAsync())
                                    {
                                        int field_index = 0;
                                        foreach (string column_name in column_names)
                                        {
                                            Type t = reader.GetFieldType(column_name);

                                            MethodInfo realFunction = genericFunction.MakeGenericMethod(t);
                                            var ret = realFunction.Invoke(reader, new object[] { field_index });

                                            await writer.WriteAsync(ret + ",");

                                            field_index++;
                                        }

                                        await writer.WriteLineAsync();
                                    }
                                }
                            }

                            await writer.FlushAsync();
                        }

                        pgd.SyncStep();
                    });

                    pgd.Reset();
                    pgd.LabelText = "Compressing Tables in Memory";
                    pgd.Maximum   = table_names.Count() - 1;

                    using (MemoryStream zip_stream = new MemoryStream())
                        using (ZipOutputStream zos = new ZipOutputStream(zip_stream))
                        {
                            zos.SetLevel(9);

                            for (int i = 0; i < table_names.Count(); i++)
                            {
                                ZipEntry ze = new ZipEntry(table_names[i] + ".csv");

                                ze.DateTime = DateTime.Now;
                                ze.Size     = output_streams[i].Length;

                                zos.PutNextEntry(ze);

                                output_streams[i].Position = 0;

                                StreamUtils.Copy(output_streams[i], zos, new byte[4096]);

                                zos.CloseEntry();

                                pgd.Step();
                            }

                            await zos.FlushAsync();

                            zos.Finish();

                            pgd.Reset();
                            pgd.LabelText = "Writing Database Backup Archive to Disk";

                            zip_stream.Position = 0;
                            File.WriteAllBytes(sfd.FileName, zip_stream.ToArray());

                            pgd.Step();
                        }

                    pgd.Dispose();
                }
            }
        }
        /// <summary>
        /// 执行ZIP文件创建功能
        /// </summary>
        /// <param name="SourceItemGroup">待压缩文件</param>
        /// <param name="NewZipPath">生成的Zip文件名</param>
        /// <param name="ZipLevel">压缩等级</param>
        /// <param name="ProgressHandler">进度通知</param>
        /// <returns>无</returns>
        public static async Task CreateZipAsync(IEnumerable <FileSystemStorageItemBase> SourceItemGroup, string NewZipPath, CompressionLevel Level, CompressionAlgorithm Algorithm, ProgressChangedEventHandler ProgressHandler = null)
        {
            if (Level == CompressionLevel.Undefine)
            {
                throw new ArgumentException("Undefine is not allowed in this function", nameof(Level));
            }

            if (Algorithm == CompressionAlgorithm.GZip)
            {
                throw new ArgumentException("GZip is not allowed in this function", nameof(Algorithm));
            }

            if (await FileSystemStorageItemBase.CreateAsync(NewZipPath, StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile)
            {
                ulong TotalSize       = 0;
                ulong CurrentPosition = 0;

                foreach (FileSystemStorageItemBase StorageItem in SourceItemGroup)
                {
                    switch (StorageItem)
                    {
                    case FileSystemStorageFile File:
                    {
                        TotalSize += File.SizeRaw;
                        break;
                    }

                    case FileSystemStorageFolder Folder:
                    {
                        TotalSize += await Folder.GetFolderSizeAsync().ConfigureAwait(false);

                        break;
                    }
                    }
                }

                if (TotalSize > 0)
                {
                    ZipStrings.CodePage = EncodingSetting.CodePage;

                    using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Exclusive).ConfigureAwait(false))
                        using (ZipOutputStream OutputStream = new ZipOutputStream(NewFileStream))
                        {
                            OutputStream.SetLevel((int)Level);
                            OutputStream.UseZip64      = UseZip64.Dynamic;
                            OutputStream.IsStreamOwner = false;

                            foreach (FileSystemStorageItemBase StorageItem in SourceItemGroup)
                            {
                                switch (StorageItem)
                                {
                                case FileSystemStorageFile File:
                                {
                                    using (FileStream FileStream = await File.GetFileStreamFromFileAsync(AccessMode.Read).ConfigureAwait(false))
                                    {
                                        ZipEntry NewEntry = new ZipEntry(File.Name)
                                        {
                                            DateTime          = DateTime.Now,
                                            CompressionMethod = Algorithm == CompressionAlgorithm.None ? CompressionMethod.Stored : Enum.Parse <CompressionMethod>(Enum.GetName(typeof(CompressionAlgorithm), Algorithm)),
                                            Size = FileStream.Length
                                        };

                                        OutputStream.PutNextEntry(NewEntry);

                                        await FileStream.CopyToAsync(OutputStream, ProgressHandler : (s, e) =>
                                            {
                                                ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + Convert.ToUInt64(e.ProgressPercentage / 100d * File.SizeRaw)) * 100d / TotalSize), null));
                                            }).ConfigureAwait(false);
                                    }

                                    OutputStream.CloseEntry();

                                    CurrentPosition += File.SizeRaw;
                                    ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32(CurrentPosition * 100d / TotalSize), null));

                                    break;
                                }

                                case FileSystemStorageFolder Folder:
                                {
                                    ulong InnerFolderSize = 0;

                                    await ZipFolderCore(Folder, OutputStream, Folder.Name, Algorithm, (ByteRead) =>
                                        {
                                            InnerFolderSize = ByteRead;
                                            ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + ByteRead) * 100d / TotalSize), null));
                                        }).ConfigureAwait(false);

                                    CurrentPosition += InnerFolderSize;
                                    ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32(CurrentPosition * 100d / TotalSize), null));

                                    break;
                                }
                                }
                            }

                            await OutputStream.FlushAsync().ConfigureAwait(false);
                        }
                }
            }
            else
            {
                throw new UnauthorizedAccessException();
            }
        }
Exemple #7
0
        public static Task Backup(string file_name)
        {
            return(Task.Run(async() =>
            {
                DateTime now_is = DateTime.Now;



                using (MemoryStream zip_stream = new MemoryStream())
                    using (ZipOutputStream zos = new ZipOutputStream(zip_stream))
                    {
                        zos.SetLevel(9);

                        using (MemoryStream ms = new MemoryStream())
                        {
                            using (MySqlConnection sqlconn = new MySqlConnection(MCv2Persistance.Instance.Config.DatabaseConfiguration.DatabaseConnectionProperties.ConnectionString))
                                using (MySqlCommand cmd = new MySqlCommand())
                                    using (MySqlBackup mb = new MySqlBackup(cmd))
                                    {
                                        cmd.Connection = sqlconn;
                                        await sqlconn.OpenAsync();
                                        mb.ExportToMemoryStream(ms);
                                    }

                            ZipEntry ze = new ZipEntry("dbbak.sql");

                            ze.DateTime = now_is;
                            ze.Size = ms.Length;

                            zos.PutNextEntry(ze);

                            ms.Position = 0;

                            StreamUtils.Copy(ms, zos, new byte[4096]);

                            zos.CloseEntry();
                            await zos.FlushAsync();
                        }

                        //

                        using (MemoryStream ms = new MemoryStream())
                        {
                            var backprop = new BackupProperties();
                            backprop.Timestamp = now_is;
                            var corrected_var = MCv2Persistance.Instance.Config.DatabaseConfiguration.DatabaseConnectionProperties;
                            corrected_var.UID = "";
                            corrected_var.Password = "";
                            backprop.Database = corrected_var;

                            var bytes = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(backprop));
                            ms.Write(bytes, 0, bytes.Length);

                            ZipEntry ze = new ZipEntry("properties.json");

                            ze.DateTime = DateTime.Now;
                            ze.Size = ms.Length;

                            zos.PutNextEntry(ze);

                            ms.Position = 0;

                            StreamUtils.Copy(ms, zos, new byte[4096]);


                            zos.CloseEntry();
                            await zos.FlushAsync();
                        }



                        zos.Finish();

                        File.WriteAllBytes(file_name, zip_stream.ToArray());
                    }
            }));
        }
        /// <summary>
        /// 执行ZIP文件创建功能
        /// </summary>
        /// <param name="SourceItemGroup">待压缩文件</param>
        /// <param name="NewZipPath">生成的Zip文件名</param>
        /// <param name="ZipLevel">压缩等级</param>
        /// <param name="ProgressHandler">进度通知</param>
        /// <returns>无</returns>
        public static async Task CreateZipAsync(IEnumerable <FileSystemStorageItemBase> SourceItemGroup, string NewZipPath, int ZipLevel, ProgressChangedEventHandler ProgressHandler = null)
        {
            if (await FileSystemStorageItemBase.CreateAsync(NewZipPath, StorageItemTypes.File, CreateOption.GenerateUniqueName).ConfigureAwait(false) is FileSystemStorageFile NewFile)
            {
                ulong TotalSize       = 0;
                ulong CurrentPosition = 0;

                using (FileStream NewFileStream = await NewFile.GetFileStreamFromFileAsync(AccessMode.Exclusive).ConfigureAwait(false))
                    using (ZipOutputStream OutputStream = new ZipOutputStream(NewFileStream))
                    {
                        OutputStream.SetLevel(ZipLevel);
                        OutputStream.UseZip64      = UseZip64.Dynamic;
                        OutputStream.IsStreamOwner = false;

                        foreach (FileSystemStorageItemBase StorageItem in SourceItemGroup)
                        {
                            switch (StorageItem)
                            {
                            case FileSystemStorageFile File:
                            {
                                TotalSize += File.SizeRaw;
                                break;
                            }

                            case FileSystemStorageFolder Folder:
                            {
                                TotalSize += await Folder.GetFolderSizeAsync().ConfigureAwait(false);

                                break;
                            }
                            }
                        }

                        foreach (FileSystemStorageItemBase StorageItem in SourceItemGroup)
                        {
                            switch (StorageItem)
                            {
                            case FileSystemStorageFile File:
                            {
                                using (FileStream FileStream = await File.GetFileStreamFromFileAsync(AccessMode.Read).ConfigureAwait(false))
                                {
                                    ZipEntry NewEntry = new ZipEntry(File.Name)
                                    {
                                        DateTime          = DateTime.Now,
                                        CompressionMethod = CompressionMethod.Deflated,
                                        Size = FileStream.Length
                                    };

                                    OutputStream.PutNextEntry(NewEntry);

                                    await FileStream.CopyToAsync(OutputStream, (s, e) =>
                                        {
                                            ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + Convert.ToUInt64(e.ProgressPercentage / 100d * File.SizeRaw)) * 100d / TotalSize), null));
                                        }).ConfigureAwait(false);
                                }

                                if (TotalSize > 0)
                                {
                                    CurrentPosition += File.SizeRaw;
                                    ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32(CurrentPosition * 100d / TotalSize), null));
                                }

                                break;
                            }

                            case FileSystemStorageFolder Folder:
                            {
                                ulong InnerFolderSize = await Folder.GetFolderSizeAsync().ConfigureAwait(false);

                                await ZipFolderCore(Folder, OutputStream, Folder.Name, (s, e) =>
                                    {
                                        if (TotalSize > 0)
                                        {
                                            ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32((CurrentPosition + Convert.ToUInt64(e.ProgressPercentage / 100d * InnerFolderSize)) * 100d / TotalSize), null));
                                        }
                                    }).ConfigureAwait(false);

                                if (TotalSize > 0)
                                {
                                    CurrentPosition += InnerFolderSize;
                                    ProgressHandler?.Invoke(null, new ProgressChangedEventArgs(Convert.ToInt32(CurrentPosition * 100d / TotalSize), null));
                                }

                                break;
                            }
                            }
                        }

                        await OutputStream.FlushAsync().ConfigureAwait(false);
                    }
            }
            else
            {
                throw new UnauthorizedAccessException();
            }
        }