C#压缩解压文件
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Text;
using static System.Console; //使用流处理文件
//FileStream //读取器和写入器
//StreamReader StreamWriter //读写二进制文件
//BinaryReader BinaryWriter //压缩流
//使用DeflateStream和GZipStream来压缩和解压缩流
//它们使用同样的压缩算法,GZipStream在后台使用DeflateStream,增加了校验 //ZipArchive类可以创建和读取ZIP文件 //添加引用System.IO.Compression.dll, System.IO.Compression.FileSystem.dll
//Windows资源管理器可以直接打开ZipArchive,但不能打开GZipStream压缩的文件 //观察文件的更改
//FileSystemWatcher namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
//文件流
string fileName = "D:\\1.txt";
//using语句会自动调用(即使发生错误)该变量的Dispose()释放资源
using (var stream = new FileStream(fileName, FileMode.Open,
FileAccess.Read, FileShare.Read))
//FileStream stream1 = File.OpenRead(fileName);
{
//ShowStreamInfo(stream);
//GetEncoding(stream);
} ReadFileUsingFileStream(fileName); //WriteTextFile(); //压缩文件
CompressFile(fileName, "D:\\1.z");
//解压缩
DecompressFile("D:\\1.z"); //压缩文件
CreateZipFile("D:\\1", "D:\\1.zip"); //观察文件的更改
string path = "d:\\1";
string filter = "*.txt";//目录下所有txt文件
var watcher = new FileSystemWatcher(path, filter) { IncludeSubdirectories = true };
watcher.Created += OnFileChanged;
watcher.Changed += OnFileChanged;
watcher.Deleted += OnFileChanged;
watcher.Renamed += OnFileRenamed; watcher.EnableRaisingEvents = true;
WriteLine("watching file changes..."); ReadKey();
} private static Encoding GetEncoding(Stream stream)
{
if (!stream.CanSeek)
throw new ArgumentException("require a stream that can seek");
Encoding encoding = Encoding.ASCII; byte[] bom = new byte[];
int nRead = stream.Read(bom, offset: , count: );
if (bom[] == 0xff && bom[] == 0xfe && bom[] == && bom[] == )
{
WriteLine("UTF-32");
stream.Seek(, SeekOrigin.Begin);
return Encoding.UTF32;
}
else if(bom[] == 0xff && bom[] == 0xfe)
{
WriteLine("UFT-16, little endian");
stream.Seek(, SeekOrigin.Begin);
return Encoding.Unicode;
}
else if (bom[] == 0xfe && bom[] == 0xff)
{
WriteLine("UTF-16, big endian");
stream.Seek(, SeekOrigin.Begin);
return Encoding.BigEndianUnicode;
}
//UTF-8是Unicode的实现方式之一。(可变长度字符编码)
else if (bom[] == 0xef && bom[] == 0xbb && bom[] == 0xbf)
{
WriteLine("UTF-8");
stream.Seek(, SeekOrigin.Begin);
return Encoding.UTF8;
} stream.Seek(, SeekOrigin.Begin);
return encoding;
} public static void ReadFileUsingFileStream(string fileName)
{
const int bufferSize = ;
using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
ShowStreamInfo(stream);
Encoding encoding = GetEncoding(stream);
byte[] buffer = new byte[bufferSize];
bool completed = false;
do
{
int nRead = stream.Read(buffer, , bufferSize);
if (nRead == )
completed = true;
if (nRead < bufferSize)
{
Array.Clear(buffer, nRead, bufferSize - nRead);
} string s = encoding.GetString(buffer, , nRead);
WriteLine($"read {nRead} bytes");
WriteLine(s);
} while (!completed);
}
} public static void ShowStreamInfo(FileStream stream)
{
WriteLine(stream.CanRead);
WriteLine(stream.CanWrite);
WriteLine(stream.CanSeek);
WriteLine(stream.CanTimeout);
WriteLine(stream.Position);
WriteLine(stream.Length); if (stream.CanTimeout)
{
WriteLine(stream.ReadTimeout);
WriteLine(stream.WriteTimeout);
stream.ReadTimeout = ;//指定超时时间
stream.WriteTimeout = ;
}
} public static void WriteTextFile()
{
string tempTextFileName = Path.ChangeExtension(Path.GetTempFileName(), "txt");
using (FileStream stream = File.OpenWrite(tempTextFileName))
{
////UTF-8
//stream.WriteByte(0xef);
//stream.WriteByte(0xbb);
//stream.WriteByte(0xbf); //或
byte[] preamble = Encoding.UTF8.GetPreamble();
stream.Write(preamble, , preamble.Length); string hello = "Hello, World!";
byte[] buffer = Encoding.UTF8.GetBytes(hello);
stream.Write(buffer, , buffer.Length);
WriteLine($"file{stream.Name} written");
}
} public static void CompressFile(string fileName, string compressedFileName)
{
using (FileStream inputStream = File.OpenRead(fileName))
{
FileStream outputStream = File.OpenWrite(compressedFileName); using (var compressStream =
new DeflateStream(outputStream, CompressionMode.Compress))
{
inputStream.CopyTo(compressStream);
}
} } public static void DecompressFile(string compressedFileName)
{
FileStream inputStream = File.OpenRead(compressedFileName); using (MemoryStream outputStream = new MemoryStream())
using (var compressStream = new DeflateStream(inputStream,
CompressionMode.Decompress))
{
compressStream.CopyTo(outputStream);
outputStream.Seek(, SeekOrigin.Begin);
using (var reader = new StreamReader(outputStream, Encoding.UTF8,
detectEncodingFromByteOrderMarks: true, bufferSize: , leaveOpen: true))
{
string result = reader.ReadToEnd();
WriteLine(result);
}
}
} public static void CreateZipFile(string directory, string zipFile)
{
FileStream zipStream = File.OpenWrite(zipFile);
using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create))
{
if (File.Exists(directory))
{
ZipArchiveEntry entry = archive.CreateEntry(Path.GetFileName(directory));
using (FileStream inputStream = File.OpenRead(directory))
using (Stream outputStream = entry.Open())
{
inputStream.CopyTo(outputStream);
}
}
else
{
//此方法不能压缩文件夹
IEnumerable<string> files = Directory.EnumerateFiles(directory, "*",
SearchOption.TopDirectoryOnly);
foreach (var file in files)
{
ZipArchiveEntry entry = archive.CreateEntry(Path.GetFileName(file));
using (FileStream inputStream = File.OpenRead(file))
using (Stream outputStream = entry.Open())
{
inputStream.CopyTo(outputStream);
}
}
}
}
} private static void OnFileChanged(object sender, FileSystemEventArgs e)
{
WriteLine($"file {e.Name} {e.ChangeType}");
} private static void OnFileRenamed(object sender, RenamedEventArgs e)
{
WriteLine($"file {e.OldName} {e.ChangeType} to {e.Name}");
}
}
}
C#压缩解压文件的更多相关文章
- 通过SharpZipLib来压缩解压文件
在项目开发中,一些比较常用的功能就是压缩解压文件了,其实类似的方法有许多 ,现将通过第三方类库SharpZipLib来压缩解压文件的方法介绍如下,主要目的是方便以后自己阅读,当然可以帮到有需要的朋友更 ...
- .NET使用ICSharpCode.SharpZipLib压缩/解压文件
SharpZipLib是国外开源加压解压库,可以方便的对文件进行加压/解压 1.下载ICSharpCode.SharpZipLib.dll,并复制到bin目录下 http://www.icsharpc ...
- huffman压缩解压文件【代码】
距离上次写完哈夫曼编码已经过去一周了,这一周都在写huffman压缩解压,哎,在很多小错误上浪费了很多时间调bug.其实这个程序的最关键部分不是我自己想的,而是借鉴了某位园友的代码,但是,无论如何,自 ...
- 【转载】.NET压缩/解压文件/夹组件
转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...
- C#使用SharpZipLib压缩解压文件
#region 加压解压方法 /// <summary> /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) /// </summary> // ...
- linux压缩解压文件
首先进入文件夹 cd /home/ftp2/1520/web 压缩方法一:压缩web下的888.com网站 zip -r 888.com.zip888.com 压缩方法二:将当前目录下的所有文件和文件 ...
- Freebsd下压缩解压文件详解
压缩篇: 把/usr/webgames目录下的文件打包.命名为bak.tar.gz 放到/usr/db-bak目录里 下面命令可以在任意目录执行.无视当前目录和将要存放文件的目录.tar -zcvf ...
- 跨平台的zip文件压缩处理,支持压缩解压文件夹
根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...
- tar压缩解压文件
查看visualization1.5.tar.gz 压缩包里面的内容: $ tar -tf visualization1.5.tar.gz 解压指定文件JavascriptVisualRelease/ ...
- Ubuntu下压缩解压文件
一般来说ubuntu 下带有tar 命令,可以用来解压和压缩之用.但是我们经常要与win下用户打交道,所以要安装一些解压工具如:rar zip 等命令. 如果要需要用到zip工具那么可以: sudo ...
随机推荐
- SQL FOREIGN KEY 约束
SQL FOREIGN KEY 约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. 让我们通过一个例子来解释外键.请看下面两个表: "Persons&quo ...
- centos7下kubernetes(11。kubernetes-运行一次性任务)
容器按照持续运行的时间可以分为两类:服务类容器和工作类容器 服务类容器:持续提供服务 工作类容器:一次性任务,处理完后容器就退出 Deployment,replicaset和daemonset都用于管 ...
- 学号 20175329 2018-2019-3《Java程序设计》第八周学习总结
学号 20175329 2018-2019-3<Java程序设计>第八周学习总结 教材学习内容总结 第十五章 泛型 可以使用"class 名称"声明一个类,为了和普通的 ...
- FM算法解析及Python实现
1. 什么是FM? FM即Factor Machine,因子分解机. 2. 为什么需要FM? 1.特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信 ...
- pyspider常见错误
安装完爬虫框架pyspider之后,使用pyspider all 命令,可能会出现以下错误: - Deprecated option 'domaincontroller': use 'http_aut ...
- Sql Server2008如何让外网访问自己的数据库
1.打开 Sql Server配置管理器 2.修改Sql Server网络配置,将Tcp/IP协议修改为“已启用” 3.重启Sql Server服务即可(如果不知道怎么重启Sql Server服务,重 ...
- Cinder组件
cinder-api cinder-api 是整个 Cinder 组件的门户,所有 cinder 的请求都首先由 cinder-api 处理. cinder-api 向外界暴露若干 HTTP REST ...
- #Leetcode# 997. Find the Town Judge
https://leetcode.com/problems/find-the-town-judge/ In a town, there are N people labelled from 1 to ...
- Vue CLI 3使用:浏览器兼容性
package.json 文件里的 browserslist 字段 (或一个单独的 .browserslistrc 文件),指定了项目的目标浏览器的范围.这个值会被 @babel/preset-env ...
- Linux下开启和关闭Telnet服务
telnet与ssh相比,安全性能并不高,但是在SSH版本升级或者其他的情况下还是需要开启这一服务. linux提供服务是由运行在后台的守护程序(daemon)来执行的,telnet服务是由xinet ...