XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension

【DLL】XFE各类拓展是一个C#的DLL库,旨在优化C#代码中常用语句的使用,并提供更简洁的访问方式,同时提供Xunit测试框架,快速搭建服务器/客户端,免费ChatGPTAPI接口,免费通讯服务器,XFE下载器,新增格式等

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

namespace XFEExtension.NetCore.FileExtension;

/// <summary>
/// 文件的拓展
/// </summary>
public static class FileExtension
{
    /// <summary>
    /// 将非法字符串写入文件
    /// </summary>
    /// <param name="objectToWrite"></param>
    /// <param name="fileName">文件名</param>
    [Obsolete("序列化方法在.NET 8.0中已经不再受支持")]
    public static void WriteInObj(this object objectToWrite, string fileName)
    {
        FileInfo fileInfo = new(fileName);
        using var fileStream = fileInfo.Create();
        BinaryFormatter binaryFormatter = new();
        binaryFormatter.Serialize(fileStream, objectToWrite);
        fileStream.Flush();
        fileStream.Close();
    }

    /// <param name="name"></param>
    extension(string name)
    {
        /// <summary>
        /// 读取文件中的字符串
        /// </summary>
        /// <param name="content">读取的内容</param>
        /// <returns>被读取的文件是否存在</returns>
        public bool ReadOut(out string? content)
        {
            FileInfo fileInfo = new(name);
            if (fileInfo.Exists)
            {
                using var streamReader = fileInfo.OpenText();
                content = streamReader.ReadToEnd();
                streamReader.Close();
                return true;
            }
            content = string.Empty;
            return false;
        }

        /// <summary>
        /// 读取文件中的字符串
        /// </summary>
        /// <returns>目标文件内容,如不存在则返回-1</returns>
        public string ReadOut()
        {
            FileInfo fileInfo = new(name);
            if (!fileInfo.Exists)
                return "-1";
            using var streamReader = fileInfo.OpenText();
            var text = streamReader.ReadToEnd();
            streamReader.Close();
            return text;
        }

        /// <summary>
        /// 读取文件中的字符串
        /// </summary>
        /// <returns></returns>
        [Obsolete("序列化方法在.NET 8.0中已经不再受支持")]
        public T? ReadOutObj<T>()
        {
            var fileInfo = new FileInfo(name);
            if (!fileInfo.Exists)
                return default;
            using var fileStream = fileInfo.OpenRead();
            BinaryFormatter bf = new();
            var result = (T)bf.Deserialize(fileStream);
            fileStream.Close();
            return result;
        }

        /// <summary>
        /// 将字符串写入文件
        /// </summary>
        /// <param name="fileName">目标文件路径及文件名</param>
        public void WriteIn(string fileName)
        {
            FileInfo fileInfo = new(fileName);
            using var fileStream = fileInfo.Create();
            var stream = Encoding.UTF8.GetBytes(name);
            fileStream.Write(stream, 0, stream.Length);
            fileStream.Flush();
        }

        /// <summary>
        /// 读取文件中的字符串
        /// </summary>
        /// <param name="exist">是否存在</param>
        /// <returns></returns>
        [Obsolete("序列化方法在.NET 8.0中已经不再受支持")]
        public string? ReadOutObj(out bool exist)
        {
            FileInfo fileInfo = new(name);
            exist = fileInfo.Exists;
            if (!fileInfo.Exists)
                return "-1";
            using var fileStream = fileInfo.OpenRead();
            BinaryFormatter binaryFormatter = new();
            var text = binaryFormatter.Deserialize(fileStream).ToString();
            fileStream.Close();
            return text;
        }

        /// <summary>
        /// 从文件反序列化对象
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <returns></returns>
        [Obsolete("序列化方法在.NET 8.0中已经不再受支持")]
        public T DeserializeFromFile<T>()
        {
            BinaryFormatter readBinary = new();
            using var readStream = File.OpenRead(name);
            var obj = (T)readBinary.Deserialize(readStream);
            readStream.Close();
            return obj;
        }

        /// <summary>
        /// 获取占用某个文件的程序
        /// </summary>
        /// <returns></returns>
        public Process? GetOwningProcess()
        {
            try
            {
                // 获取所有正在运行的进程
                var processes = Process.GetProcesses();

                foreach (var process in processes)
                {
                    try
                    {
                        // 获取进程打开的文件句柄信息
                        if (process.Modules.Cast<ProcessModule>().Any(module =>
                                module.FileName.Equals(name, StringComparison.OrdinalIgnoreCase)))
                            return process; // 返回占用文件的进程
                    }
                    catch (Exception)
                    {
                        // 忽略无法访问的进程
                    }
                }
            }
            catch (Exception)
            {
                // 忽略获取进程信息时的异常
            }
            return null; // 如果没有找到占用文件的进程,返回null
        }
    }

    /// <summary>
    /// 读取文件中的字符串
    /// </summary>
    /// <param name="fileName">目标文件路径及文件名</param>
    /// <param name="exist">目标文件是否存在</param>
    /// <returns>目标文件内容,如不存在则返回-1</returns>
    public static string? ReadOut(string fileName, out bool exist)
    {
        FileInfo fileInfo = new(fileName);
        exist = fileInfo.Exists;
        if (!fileInfo.Exists)
            return "-1";
        using var streamReader = fileInfo.OpenText();
        var text = streamReader.ReadLine();
        streamReader.Close();
        return text;
    }

    /// <summary>
    /// 序列化对象到文件
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="fileName">文件路径</param>
    [Obsolete("序列化方法在.NET 8.0中已经不再受支持")]
    public static void SerializeToFile(this object obj, string fileName)
    {
        BinaryFormatter writeBinary = new();
        using var writeStream = File.OpenWrite(fileName);
        writeBinary.Serialize(writeStream, obj);
        writeStream.Flush();
        writeStream.Close();
    }

    /// <summary>
    /// 输出文件大小
    /// </summary>
    /// <param name="bufferLength"></param>
    /// <returns></returns>
    public static string FileSize(this long bufferLength)
    {
        string[] sizes = ["B", "KB", "MB", "GB", "TB"];
        double len = bufferLength;
        var order = 0;
        while (len >= 1024 && order < sizes.Length - 1)
        {
            order++;
            len /= 1024;
        }
        return $"{len:0.##} {sizes[order]}";
    }

    /// <param name="fileStream">文件流</param>
    extension(FileStream fileStream)
    {
        /// <summary>
        /// 获取文件的有效起始位置
        /// </summary>
        /// <param name="startPosition">起始搜寻位置</param>
        /// <param name="endPosition">结束搜寻位置</param>
        /// <returns>一个长整型,介于起始位置和结束位置之间</returns>
        public async Task<long> GetValidPosition(long startPosition, long endPosition)
        {
            var seekPosition = endPosition;
            fileStream.Seek(startPosition, SeekOrigin.Begin);
            var buffer = new byte[endPosition - startPosition];
            await fileStream.ReadExactlyAsync(buffer.AsMemory(0, (int)(endPosition - startPosition)));
            for (var i = buffer.Length - 1; i >= 0; i--)
            {
                if (buffer[i] != 0)
                    break;
                seekPosition--;
            }
            return seekPosition > startPosition ? seekPosition : startPosition;
        }

        /// <summary>
        /// 获取文件的有效起始位置
        /// </summary>
        /// <param name="startPosition">起始搜寻位置</param>
        /// <returns>一个长整型,介于起始位置和结束位置之间</returns>
        public async Task<long> GetValidPosition(long startPosition) => await fileStream.GetValidPosition(startPosition, fileStream.Length);

        /// <summary>
        /// 获取文件的有效起始位置
        /// </summary>
        /// <returns>一个长整型,介于起始位置和结束位置之间</returns>
        public async Task<long> GetValidPosition() => await fileStream.GetValidPosition(0, fileStream.Length);
    }
}