//************************************************************************
// author: yuzhengyang
// date: 2017.6.12 - 2017.6.12
// desc: 文件压缩
// Copyright (c) yuzhengyang. All rights reserved.
//************************************************************************
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
namespace Azylee.Core.IOUtils.FileUtils
{
///
/// 文件压缩
///
public class FileCompressTool
{
///
/// 压缩
///
///
///
public static bool Compress(string file)
{
FileInfo fileInfo = null;
if (File.Exists(file)) fileInfo = new FileInfo(file);
if (fileInfo == null) return false;
using (FileStream originalFileStream = fileInfo.OpenRead())
{
if ((File.GetAttributes(fileInfo.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileInfo.Extension != ".gz")
{
using (FileStream compressedFileStream = File.Create(fileInfo.FullName + ".gz"))
{
using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
{
originalFileStream.CopyTo(compressionStream);
return true;
}
}
}
}
return false;
}
///
/// 解压缩
///
///
///
public static bool Decompress(string file)
{
FileInfo fileInfo = null;
if (File.Exists(file)) fileInfo = new FileInfo(file);
if (fileInfo == null) return false;
try
{
using (FileStream originalFileStream = fileInfo.OpenRead())
{
string currentFileName = fileInfo.FullName;
string newFileName = currentFileName.Remove(currentFileName.Length - fileInfo.Extension.Length);
using (FileStream decompressedFileStream = File.Create(newFileName))
{
using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedFileStream);
return true;
}
}
}
}
catch (Exception e)
{
return false;
}
}
///
/// 单文件压缩(生成的压缩包和第三方的解压软件兼容)
///
///
///
public string CompressSingle(string sourceFilePath)
{
string zipFileName = sourceFilePath + ".gz";
using (FileStream sourceFileStream = new FileInfo(sourceFilePath).OpenRead())
{
using (FileStream zipFileStream = File.Create(zipFileName))
{
using (GZipStream zipStream = new GZipStream(zipFileStream, CompressionMode.Compress))
{
sourceFileStream.CopyTo(zipStream);
}
}
}
return zipFileName;
}
///
/// 自定义多文件压缩(生成的压缩包和第三方的压缩文件解压不兼容)
///
/// 文件列表
/// 压缩包全路径
public void CompressMulti(string[] sourceFileList, string saveFullPath)
{
MemoryStream ms = new MemoryStream();
foreach (string filePath in sourceFileList)
{
Console.WriteLine(filePath);
if (File.Exists(filePath))
{
string fileName = Path.GetFileName(filePath);
byte[] fileNameBytes = Encoding.UTF8.GetBytes(fileName);
byte[] sizeBytes = BitConverter.GetBytes(fileNameBytes.Length);
ms.Write(sizeBytes, 0, sizeBytes.Length);
ms.Write(fileNameBytes, 0, fileNameBytes.Length);
byte[] fileContentBytes = File.ReadAllBytes(filePath);
ms.Write(BitConverter.GetBytes(fileContentBytes.Length), 0, 4);
ms.Write(fileContentBytes, 0, fileContentBytes.Length);
}
}
ms.Flush();
ms.Position = 0;
using (FileStream zipFileStream = File.Create(saveFullPath))
{
using (GZipStream zipStream = new GZipStream(zipFileStream, CompressionMode.Compress))
{
ms.Position = 0;
ms.CopyTo(zipStream);
}
}
ms.Close();
}
///
/// 多文件压缩解压
///
/// 压缩文件路径
/// 解压目录
public void DeCompressMulti(string zipPath, string targetPath)
{
byte[] fileSize = new byte[4];
if (File.Exists(zipPath))
{
using (FileStream fStream = File.Open(zipPath, FileMode.Open))
{
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream zipStream = new GZipStream(fStream, CompressionMode.Decompress))
{
zipStream.CopyTo(ms);
}
ms.Position = 0;
while (ms.Position != ms.Length)
{
ms.Read(fileSize, 0, fileSize.Length);
int fileNameLength = BitConverter.ToInt32(fileSize, 0);
byte[] fileNameBytes = new byte[fileNameLength];
ms.Read(fileNameBytes, 0, fileNameBytes.Length);
string fileName = System.Text.Encoding.UTF8.GetString(fileNameBytes);
string fileFulleName = targetPath + fileName;
ms.Read(fileSize, 0, 4);
int fileContentLength = BitConverter.ToInt32(fileSize, 0);
byte[] fileContentBytes = new byte[fileContentLength];
ms.Read(fileContentBytes, 0, fileContentBytes.Length);
using (FileStream childFileStream = File.Create(fileFulleName))
{
childFileStream.Write(fileContentBytes, 0, fileContentBytes.Length);
}
}
}
}
}
}
}
}