C# 中IO操作通用类

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    /*
     Io Options Common Methods
     */
    public class GenericIoTask
    {
        public static bool CopyDirectory(string sourceDir, string destDir, bool recursive)
        {
            var sourceDirInfo = new DirectoryInfo(sourceDir);
            if (!sourceDirInfo.Exists)
            {
                return false;
            }
            DirectoryInfo[] sourceDirs = sourceDirInfo.GetDirectories();
            if (!Directory.Exists(destDir))
            {
                Directory.CreateDirectory(destDir);
            }
            foreach (var fileInfo in sourceDirInfo.GetFiles())
            {
                string targetFilePath = Path.Combine(destDir, fileInfo.Name);
                fileInfo.CopyTo(targetFilePath);
            }
            if (recursive)
            {
                foreach (var subDir in sourceDirs)
                {
                    string newDestDir = Path.Combine(destDir, subDir.Name);
                    CopyDirectory(subDir.FullName, newDestDir, true);
                }
                return true;
            }
            else
            {
                return true;
            }
        }

        public static IEnumerable<string> GetDirectoryFiles(string destDir, Func<string, bool> predicate, bool recursive)
        {
            IEnumerable<string> files = Array.Empty<string>();
            if (!Directory.Exists(destDir))
            {
                return files;
            }
            SearchOption searchOption = SearchOption.TopDirectoryOnly;
            if (recursive)
            {
                searchOption = SearchOption.AllDirectories;
            }
            files = Directory.EnumerateFiles(destDir, "*.*", searchOption);
            if (predicate != null)
            {
                files = files.Where(predicate);
            }
            return files;
        }

        public static bool BinaryWriterEntity<T>(string path, T data)
        {
            try
            {
                using FileStream fileStream =
                    new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
                using BinaryWriter binaryWriter = new BinaryWriter(fileStream);
                binaryWriter.Write(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data)));
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public static bool BinaryReadEntity<T>(string path, out T? data)
        {
            bool readFalg = false;
            data = default;
            try
            {
                using FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                using BinaryReader binaryReader = new BinaryReader(fileStream);
                byte[] dataBuf = binaryReader.ReadBytes((int)fileStream.Length);
                data = JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(dataBuf));
                readFalg = true;
            }
            catch (Exception)
            {
                readFalg = false;
            }
            return readFalg;
        }

        public static async Task<bool> WriteLogAsync(string messsage, TextWriter writer)
        {
            try
            {
                await writer.WriteAsync(messsage);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        public static async Task<List<string>> ReadLogAsync(TextReader reader)
        {
            List<string> list = new List<string>();
            try
            {
                string? linLog;
                while ((linLog = await reader.ReadLineAsync()) != null)
                {
                    list.Add(linLog);
                }
            }
            catch (Exception)
            {
            }
            return list;
        }

        public static async Task<bool> StreamWriterAsync(string path, string msg)
        {
            using StreamWriter sw = new StreamWriter(path, true);
            await sw.WriteAsync(msg);
            //await File.AppendAllLinesAsync(path,msg)
            //await File.AppendAllTextAsync(path, msg);
            return true;
        }

        public static async Task<byte[]> CompressOptionAsync(byte[]? bytes, CompressOptionType optionType)
        {
            using MemoryStream destSm = new MemoryStream();
            if (bytes == null || bytes.Length <= 0)
            {
                return destSm.ToArray();
            }
            using MemoryStream sourceSm = new MemoryStream(bytes);
            Stream? optionerSm = default;
            switch (optionType)
            {
                case CompressOptionType.ZipCompress:
                    optionerSm = new GZipStream(destSm, CompressionMode.Compress);
                    await sourceSm.CopyToAsync(optionerSm);
                    break;
                case CompressOptionType.DeflateCompress:
                    optionerSm = new DeflateStream(destSm, CompressionMode.Compress);
                    await sourceSm.CopyToAsync(optionerSm);
                    break;
                case CompressOptionType.ZipDeCompress:
                    optionerSm = new GZipStream(sourceSm, CompressionMode.Decompress);
                    await optionerSm.CopyToAsync(destSm);
                    break;
                case CompressOptionType.DeflateDeCompress:
                    optionerSm = new DeflateStream(sourceSm, CompressionMode.Decompress);
                    await optionerSm.CopyToAsync(destSm);
                    break;
                default:
                    break;
            }
            optionerSm?.Flush();
            optionerSm?.Dispose();
            return destSm.ToArray();
        }

        public static async Task CompressAsync(DirectoryInfo directorySelected)
        {
            foreach (var fileToCompress in directorySelected.GetFiles())
            {
                using FileStream OriginalFileStream = fileToCompress.OpenRead();
                var originalAtt = File.GetAttributes(fileToCompress.FullName);
                if (originalAtt == FileAttributes.Compressed)
                {
                    continue;
                }
                using FileStream compressFileStrem = File.Create(fileToCompress + ".gz");
                using GZipStream gZipStream = new GZipStream(compressFileStrem, CompressionMode.Compress);
                await OriginalFileStream.CopyToAsync(gZipStream);
                await gZipStream.FlushAsync();
            }
        }
    }

    public enum CompressOptionType : byte
    {
        ZipCompress,
        DeflateCompress,
        ZipDeCompress,
        DeflateDeCompress,
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望天hous

你的鼓励是我最大动力~谢谢啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值