using System.Collections.Generic; using System.IO; using System.IO.Compression; using UnityEngine; public static class Extend { /// /// 将流转成字节数组 /// /// 文件流 /// public static byte[] ToBytes(this Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); return bytes; } /// /// 获取文件的内容(字节数组) /// /// 绝对路径 /// public static byte[] GetBytesFromPath(string absolutePath) { using (Stream fileStream = new FileStream(absolutePath, FileMode.OpenOrCreate)) { return fileStream.ToBytes(); } } /// /// 字节数组写入文件 /// /// 文件内容 /// 绝对路径 public static void WriteToFile(this byte[] bytes, string absolutePath) { if (File.Exists(absolutePath)) { File.Delete(absolutePath); } using (var fs = new FileStream(absolutePath, FileMode.Create)) { fs.Write(bytes, 0, bytes.Length); } } /// /// 将Zip文件描述对象打包成Zip文件,并返回字节数组 /// /// Zip文件描述对象数组 /// public static byte[] PackedZip(this List zipFiles) { using (Stream memoryStream = new MemoryStream()) { using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { foreach (var zipFile in zipFiles) { zipArchive.AddFile(zipFile.RelativePath, zipFile.Content); } } memoryStream.Seek(0, SeekOrigin.Begin); //这句要在using ZipArchive外面,否则压缩文件会被损坏 return memoryStream.ToBytes(); } } /// /// 向Zip文件中添加文件 /// /// /// 相对路径 /// 文件内容 /// private static bool AddFile(this ZipArchive zipArchive, string relativePath, byte[] bytes) { try { ZipArchiveEntry entry = zipArchive.CreateEntry(relativePath); using (Stream entryStream = entry.Open()) { entryStream.Write(bytes, 0, bytes.Length); } return true; } catch { return false; } } } /// /// 描述打包成Zip时的一个文件的信息 /// public class ZipFile { /// /// 文件相对路径,带文件名和拓展名 /// public string RelativePath { get; set; } /// /// 字节数组(文件内容) /// public byte[] Content { get; set; } } /*** * Title:"基础工具" 项目 * 主题:压缩包帮助类 * Description: * 功能:【该压缩方法来自:https://www.cnblogs.com/Chary/p/No0000DF.html】 * 1、创建 zip 存档,该文档包含指定目录的文件和子目录(单个目录) * 2、创建 zip 存档,该存档包含指定目录的文件和目录(多个目录) * 3、递归删除磁盘上的指定文件夹目录及文件 * 4、递归获取磁盘上的指定目录下所有文件的集合,返回类型是:字典[文件名,要压缩的相对文件名] * 5、解压Zip文件,并覆盖保存到指定的目标路径文件夹下 * 6、获取Zip压缩包中的文件列表 * Date:2021 * Version:0.1版本 * Author:Coffee * Modify Recoder: */ //public class Program //{ // private static string directoryPath = @".\temp"; // public static void Main() // { // DirectoryInfo directorySelected = new DirectoryInfo(directoryPath); // Compress(directorySelected); // foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz")) // { // Decompress(fileToDecompress); // } // } // public static void Compress(DirectoryInfo directorySelected) // { // foreach (FileInfo fileToCompress in directorySelected.GetFiles()) // { // using (FileStream originalFileStream = fileToCompress.OpenRead()) // { // if ((File.GetAttributes(fileToCompress.FullName) & // FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz") // { // using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz")) // { // using (GZipStream compressionStream = new GZipStream(compressedFileStream, // CompressionMode.Compress)) // { // originalFileStream.CopyTo(compressionStream); // } // } // FileInfo info = new FileInfo(directoryPath + Path.DirectorySeparatorChar + fileToCompress.Name + ".gz"); // Debug.Log($"Compressed {fileToCompress.Name} from {fileToCompress.Length.ToString()} to {info.Length.ToString()} bytes."); // } // } // } // } // public static void Decompress(FileInfo fileToDecompress) // { // using (FileStream originalFileStream = fileToDecompress.OpenRead()) // { // string currentFileName = fileToDecompress.FullName; // string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length); // using (FileStream decompressedFileStream = File.Create(newFileName)) // { // using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress)) // { // decompressionStream.CopyTo(decompressedFileStream); // Debug.Log($"Decompressed: {fileToDecompress.Name}"); // } // } // } // } //}