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#压缩解压文件的更多相关文章

  1. 通过SharpZipLib来压缩解压文件

    在项目开发中,一些比较常用的功能就是压缩解压文件了,其实类似的方法有许多 ,现将通过第三方类库SharpZipLib来压缩解压文件的方法介绍如下,主要目的是方便以后自己阅读,当然可以帮到有需要的朋友更 ...

  2. .NET使用ICSharpCode.SharpZipLib压缩/解压文件

    SharpZipLib是国外开源加压解压库,可以方便的对文件进行加压/解压 1.下载ICSharpCode.SharpZipLib.dll,并复制到bin目录下 http://www.icsharpc ...

  3. huffman压缩解压文件【代码】

    距离上次写完哈夫曼编码已经过去一周了,这一周都在写huffman压缩解压,哎,在很多小错误上浪费了很多时间调bug.其实这个程序的最关键部分不是我自己想的,而是借鉴了某位园友的代码,但是,无论如何,自 ...

  4. 【转载】.NET压缩/解压文件/夹组件

    转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...

  5. C#使用SharpZipLib压缩解压文件

    #region 加压解压方法 /// <summary> /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) /// </summary> // ...

  6. linux压缩解压文件

    首先进入文件夹 cd /home/ftp2/1520/web 压缩方法一:压缩web下的888.com网站 zip -r 888.com.zip888.com 压缩方法二:将当前目录下的所有文件和文件 ...

  7. Freebsd下压缩解压文件详解

    压缩篇: 把/usr/webgames目录下的文件打包.命名为bak.tar.gz 放到/usr/db-bak目录里 下面命令可以在任意目录执行.无视当前目录和将要存放文件的目录.tar -zcvf ...

  8. 跨平台的zip文件压缩处理,支持压缩解压文件夹

    根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...

  9. tar压缩解压文件

    查看visualization1.5.tar.gz 压缩包里面的内容: $ tar -tf visualization1.5.tar.gz 解压指定文件JavascriptVisualRelease/ ...

  10. Ubuntu下压缩解压文件

    一般来说ubuntu 下带有tar 命令,可以用来解压和压缩之用.但是我们经常要与win下用户打交道,所以要安装一些解压工具如:rar zip 等命令. 如果要需要用到zip工具那么可以: sudo ...

随机推荐

  1. 总结JAVA----IO流中的File类

    对于IO流中File类的总结 File类的基本概念 File类只能用于完成对于文件属性(是否存在.可读性.长度)的一些操作,不能用于文件的访问. File类的对象 File类的对象存储的是文件的绝对路 ...

  2. macos 下usb键盘问题.

    Mac 与PC键盘的对比及快捷键(黑苹果) https://www.jianshu.com/p/240f31f6f81a 剩下的就是 系统偏好设置 - 键盘 - 修饰键 - USB键盘(目标键盘) 把 ...

  3. 26 python 初学(线程、同步锁、死锁和递归锁)

    参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 并发:一段时间内做一些事情 并行:同时做多件事情 线程是操作系统能够进行运算调度的基本单位 ...

  4. [Unity优化]批处理04:MaterialPropertyBlock

    参考链接: https://blog.csdn.net/liweizhao/article/details/81937590 1.在场景中放一些Cube,赋予一个新材质,使用内置shader(Unli ...

  5. logrotate日志处理

    介绍 logrotate旨在简化生成大量日志文件的系统的管理.它允许日志文件的自动轮换.压缩.删除和邮件.每个日志文件可以每天.每周.每月处理,也可以在它变得太大时处理.通常,logrotate作为每 ...

  6. 微服务领域是不是要变天了?Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器!

    引言 微服务这个词的热度自它出现以后,就一直是高烧不退,而微服务之所以这么火,其实和近几年互联网的创业氛围是分不开的. 与传统行业不同,互联网企业有一个特点,那就是市场扩张速度非常之快,可能也就是几天 ...

  7. virtualbox 设置centos7 双网卡上网

    上次用virtualbox安装centos6.6,这次装了一个centos7.0.用两个版本的配置还是大同小异的. 1.修改/etc/sysconfig/network-scripts/ifcfg-e ...

  8. 2018 C++ Teaching Assistant Summary

    期末考结束后就留校开始了科研,最近刚回家休息了两三天,整理了思绪,准备补上这一篇拖延了一个多月的助教小结. 早在一年多前我上栋哥这门课时,我就十分乐意给予同学帮助,无论是技术上的,还是说思想上的(也可 ...

  9. PS外挂滤镜调出清晰对比照片

    最终效果 一.打开原图. 二.我们使用类似第一部分的相同方法,但设置上略有不同,我们将光线放在不同的地方.复制底层,执行滤镜-LUCIS ART水彩滤镜-LUCISART 选择 雕刻 设置参数为25. ...

  10. Codeforces 1082B Vova and Trophies(前缀+后缀)

    题目链接:Vova and Trophies 题意:给定长度为n的字符串s,字符串中只有G和S,只允许最多一次操作:任意位置的两个字符互换.求连续G的最长长度. 题解:维护pre和pr,nxt和nx. ...