zoukankan      html  css  js  c++  java
  • 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[5];
                int nRead = stream.Read(bom, offset: 0, count: 5);
                if (bom[0] == 0xff && bom[1] == 0xfe && bom[2] == 0 && bom[3] == 0)
                {
                    WriteLine("UTF-32");
                    stream.Seek(4, SeekOrigin.Begin);
                    return Encoding.UTF32;
                }
                else if(bom[0] == 0xff && bom[1] == 0xfe)
                {
                    WriteLine("UFT-16, little endian");
                    stream.Seek(2, SeekOrigin.Begin);
                    return Encoding.Unicode;
                }
                else if (bom[0] == 0xfe && bom[1] == 0xff)
                {
                    WriteLine("UTF-16, big endian");
                    stream.Seek(2, SeekOrigin.Begin);
                    return Encoding.BigEndianUnicode;
                }
                //UTF-8是Unicode的实现方式之一。(可变长度字符编码)
                else if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf)
                {
                    WriteLine("UTF-8");
                    stream.Seek(3, SeekOrigin.Begin);
                    return Encoding.UTF8;
                }
    
                stream.Seek(0, SeekOrigin.Begin);
                return encoding;
            }
            
            public static void ReadFileUsingFileStream(string fileName)
            {
                const int bufferSize = 1024;
                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, 0, bufferSize);
                        if (nRead == 0)
                            completed = true;
                        if (nRead < bufferSize)
                        {
                            Array.Clear(buffer, nRead, bufferSize - nRead);
                        }
    
                        string s = encoding.GetString(buffer, 0, 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 = 1000;//指定超时时间
                    stream.WriteTimeout = 1000;
                }
            }
    
            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, 0, preamble.Length);
    
                    string hello = "Hello, World!";
                    byte[] buffer = Encoding.UTF8.GetBytes(hello);
                    stream.Write(buffer, 0, 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(0, SeekOrigin.Begin);
                    using (var reader = new StreamReader(outputStream, Encoding.UTF8,
                        detectEncodingFromByteOrderMarks: true, bufferSize: 4096, 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}");
            }
        }
    }
  • 相关阅读:
    keys命令的缺点
    redis与memcache的区别
    sql与nosql如何选择?
    MongoDB与MySql的区别
    linux环境搭建系列之memcached安装步骤
    linux环境搭建系列之tomcat安装步骤
    linux环境搭建系列之Apache ant安装步骤
    linux环境搭建系列之jdk安装
    虚拟机安装教程(linux、centOS)
    memcached解压报错gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now的解决方法
  • 原文地址:https://www.cnblogs.com/xslwm/p/9640093.html
Copyright © 2011-2022 走看看