• [No0000DC]C# FileHelper 本地文件、文件夹操作类封装FileHelper


    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Text;
    using Shared;
    
    namespace PublishPart.Helpers
    {
        public static class FileHelper
        {
            #region  Methods
    
            /// <summary>
            ///     向文本文件的尾部追加内容
            /// </summary>
            /// <param name="filePath"></param>
            /// <param name="content">写入的内容</param>
            public static void AppendText(string filePath, string content)
            {
                File.AppendAllText(filePath, content);
            }
    
    
            /// <summary>
            ///     清空指定目录下所有文件及子目录,但该目录依然保存.
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            public static void ClearDirectory(string directoryPath)
            {
                if (IsExistDirectory(directoryPath))
                {
                    //删除目录中所有的文件
                    var filePaths = GetFileNames(directoryPath);
                    foreach (var filePath in filePaths)
                        DeleteFile(filePath);
    
                    //删除目录中所有的子目录
                    var directoryPaths = GetDirectories(directoryPath);
                    foreach (var oneDirectoryPath in directoryPaths)
                        DeleteDirectory(oneDirectoryPath);
                }
            }
    
    
            /// <summary>
            ///     清空文件内容
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static void ClearFile(string filePath)
            {
                //删除文件
                File.Delete(filePath);
    
                //重新创建该文件
                CreateFile(filePath);
            }
    
    
            /// <summary>
            ///     检测指定目录中是否存在指定的文件,若要搜索子目录请使用重载方法.
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            /// <param name="searchPattern">
            ///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。
            ///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。
            /// </param>
            public static bool Contains(string directoryPath, string searchPattern)
            {
                try
                {
                    //获取指定的文件列表
                    var fileNames = GetFileNames(directoryPath, searchPattern, false);
    
                    //判断指定文件是否存在
                    return fileNames.Length != 0;
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return false;
                }
            }
    
            /// <summary>
            ///     检测指定目录中是否存在指定的文件
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            /// <param name="searchPattern">
            ///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。
            ///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。
            /// </param>
            /// <param name="isSearchChild">是否搜索子目录</param>
            public static bool Contains(string directoryPath, string searchPattern, bool isSearchChild)
            {
                try
                {
                    //获取指定的文件列表
                    var fileNames = GetFileNames(directoryPath, searchPattern, true);
    
                    //判断指定文件是否存在
                    return fileNames.Length != 0;
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return false;
                }
            }
    
    
            /// <summary>
            ///     将源文件的内容复制到目标文件中
            /// </summary>
            /// <param name="sourceFilePath">源文件的绝对路径</param>
            /// <param name="destFilePath">目标文件的绝对路径</param>
            public static void Copy(string sourceFilePath, string destFilePath)
            {
                File.Copy(sourceFilePath, destFilePath, true);
            }
    
    
            /// <summary>
            ///     将一个目录的文件拷贝到另外一个目录去
            /// </summary>
            /// <param name="srcPath">源目录</param>
            /// <param name="aimPath">目标目录</param>
            /// <param name="flag">是否允许覆盖同名文件</param>
            /// <param name="version">当出现多次调用此方法的时候,能够重命名多次,比如xxx.1.old,xxx.2.old</param>
            public static void CopyDir(string srcPath, string aimPath, bool flag, int version)
            {
                // 检查目标目录是否以目录分割字符结束如果不是则添加之
                if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar)
                    aimPath += Path.DirectorySeparatorChar;
    
                // 判断目标目录是否存在如果不存在则新建之
                CreateDirectory(aimPath);
    
                // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
                // 如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法
                var fileList = Directory.GetFileSystemEntries(srcPath);
    
                // 遍历所有的文件和目录
                foreach (var file in fileList)
                    try
                    {
                        // 如果这是一个目录,并且不是update目录,递归
                        if (Directory.Exists(file))
                        {
                            var path = Path.GetDirectoryName(file);
                            if (path != null)
                            {
                                var dirName = path.Split('\');
                                if (dirName[dirName.Length - 1].ToLower() != "update")
                                    CopyDir(file, aimPath + Path.GetFileName(file), flag, version);
                            }
                        }
    
                        // 否则直接Copy文件(不拷贝update.xml文件)
                        else if (!file.ToLower().Contains("update.xml"))
                        {
                            //如果是pdb文件,直接忽略
                            if (file.Contains(".pdb") || file.Contains(".vshost.exe"))
                                continue;
                            //如果文件是dll或者exe文件,则可能是正在使用的文件,不能直接替换
                            if (file.ToLower().Contains(".exe") || file.ToLower().Contains(".dll") ||
                                file.ToLower().Contains(".pdb"))
                            {
                                var exist = false;
    
                                //正在使用的文件将不能拷贝
                                var onUsedFiles = AppDomain.CurrentDomain.GetAssemblies();
    
    
                                foreach (var onUsedFile in onUsedFiles)
                                {
                                    var filename = onUsedFile.ManifestModule.Name;
    
                                    //正在使用的文件
                                    if (file.Contains(filename))
                                    {
                                        //先判断这个文件存在
                                        if (Contains(aimPath, Path.GetFileName(file)))
                                            File.Move(aimPath + Path.GetFileName(file),
                                                aimPath + Path.GetFileName(file) + "." + version + ".old");
                                        File.Copy(file, aimPath + Path.GetFileName(file), true);
                                        exist = true;
                                        break;
                                    }
                                }
    
                                //不是依赖项并且本身不是更新程序本身
                                if (!exist)
                                    File.Copy(file, aimPath + Path.GetFileName(file), true);
                                //更新程序自身的更新(单独调试此工程的时候需要用到这一段)
                                /*if (Path.GetFileName(file) == "EastMoney.BPF.DataPlatformUpgrade.exe")
                                {
                                    try
                                    {
                                        File.Move(aimPath + Path.GetFileName(file),
                                            aimPath + Path.GetFileName(file) + "." + version + ".old");
    
                                        File.Copy(file, aimPath + Path.GetFileName(file), true);
                                    }
                                    catch (Exception exception)
                                    {
                                                        LogHelper.LogError("Error! ", exception);
                                    }
                                }*/
                            }
                            else
                            {
                                File.Copy(file, aimPath + Path.GetFileName(file), true);
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        LogHelper.LogError("拷贝文件失败,失败原因为:" + exception.Message + " 文件名为:" + file, exception);
                    }
            }
    
    
            /// <summary>
            ///     创建一个目录
            /// </summary>
            /// <param name="directoryPath">目录的绝对路径</param>
            public static void CreateDirectory(string directoryPath)
            {
                //如果目录不存在则创建该目录
                if (!IsExistDirectory(directoryPath))
                    Directory.CreateDirectory(directoryPath);
            }
    
    
            /// <summary>
            ///     创建一个文件。
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static bool CreateFile(string filePath)
            {
                try
                {
                    //如果文件不存在则创建该文件
                    if (!IsExistFile(filePath))
                    {
                        var fileInfo = new FileInfo(filePath); //创建一个FileInfo对象
                        var fileStream = fileInfo.Create(); //创建文件
                        fileStream.Close(); //关闭文件流
                    }
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return false;
                }
    
                return true;
            }
    
            /// <summary>
            ///     创建一个文件,并将字节流写入文件。
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            /// <param name="buffer">二进制流数据</param>
            public static bool CreateFile(string filePath, byte[] buffer)
            {
                try
                {
                    //如果文件不存在则创建该文件
                    if (!IsExistFile(filePath))
                    {
                        //创建一个FileInfo对象
                        var file = new FileInfo(filePath);
    
                        //创建文件
                        var fs = file.Create();
    
                        //写入二进制流
                        fs.Write(buffer, 0, buffer.Length);
    
                        //关闭文件流
                        fs.Close();
                    }
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return false;
                }
                return true;
            }
    
    
            /// <summary>
            ///     删除指定目录及其所有子目录(打开状态下降不能删除)
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            public static void DeleteDirectory(string directoryPath)
            {
                if (IsExistDirectory(directoryPath))
                    try
                    {
                        Directory.Delete(directoryPath, true);
                    }
                    catch (Exception exception)
                    {
                        LogHelper.LogError("删除出错,可能是因为文件夹被打开了!请关闭后再试!路径为" + directoryPath + exception.Message, exception);
                    }
            }
    
            /// <summary>
            /// 调用bat删除目录,以防止系统底层的异步删除机制
            /// </summary>
            /// <param name="dirPath"></param>
            /// <returns></returns>
            public static bool DeleteDirectoryWithCmd(string dirPath)
            {
                var process = new Process(); //string path = ...;//bat路径  
                var processStartInfo = new ProcessStartInfo("CMD.EXE", "/C rd /S /Q "" + dirPath + """)
                {
                    UseShellExecute = false,
                    RedirectStandardOutput = true
                }; //第二个参数为传入的参数,string类型以空格分隔各个参数  
                process.StartInfo = processStartInfo;
                process.Start();
                process.WaitForExit();
                var output = process.StandardOutput.ReadToEnd();
                if (string.IsNullOrWhiteSpace(output))
                    return true;
                return false;
            }
    
            /// <summary>
            /// 调用bat删除文件,以防止系统底层的异步删除机制
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static bool DelFileWithCmd(string filePath)
            {
                var process = new Process(); //string path = ...;//bat路径  
                var processStartInfo = new ProcessStartInfo("CMD.EXE", "/C del /F /S /Q "" + filePath + """)
                {
                    UseShellExecute = false,
                    RedirectStandardOutput = true
                }; //第二个参数为传入的参数,string类型以空格分隔各个参数  
                process.StartInfo = processStartInfo;
                process.Start();
                process.WaitForExit();
                var output = process.StandardOutput.ReadToEnd();
                if (output.Contains(filePath))
                    return true;
                return false;
            }
    
    
            /// <summary>
            ///     删除指定文件
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static void DeleteFile(string filePath)
            {
                if (IsExistFile(filePath))
                    File.Delete(filePath);
            }
    
    
            /// <summary>
            ///     通过后缀名在目录中查找文件
            /// </summary>
            /// <param name="directory">目录</param>
            /// <param name="pattern">后缀名</param>
            public static void DeleteFiles(DirectoryInfo directory, string pattern)
            {
                if (directory.Exists && pattern.Trim() != string.Empty)
                {
                    try
                    {
                        foreach (var fileInfo in directory.GetFiles(pattern))
                            fileInfo.Delete();
                    }
                    catch (Exception exception)
                    {
                        LogHelper.LogError("Error! ", exception);
                    }
                    foreach (var info in directory.GetDirectories())
                        DeleteFiles(info, pattern);
                }
            }
    
    
            /// <summary>
            ///     将文件读取到缓冲区中
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static byte[] FileToBytes(string filePath)
            {
                //获取文件的大小 
                var fileSize = GetFileSize(filePath);
    
                //创建一个临时缓冲区
                var buffer = new byte[fileSize];
    
                //创建一个文件流
                var fileInfo = new FileInfo(filePath);
                var fileStream = fileInfo.Open(FileMode.Open);
    
                try
                {
                    //将文件流读入缓冲区
                    fileStream.Read(buffer, 0, fileSize);
    
                    return buffer;
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return null;
                }
                finally
                {
                    fileStream.Close(); //关闭文件流
                }
            }
    
    
            /// <summary>
            ///     将文件读取到字符串中
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static string FileToString(string filePath)
            {
                return FileToString(filePath, Encoding.Default);
            }
    
            /// <summary>
            ///     将文件读取到字符串中
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            /// <param name="encoding">字符编码</param>
            public static string FileToString(string filePath, Encoding encoding)
            {
                //创建流读取器
                var reader = new StreamReader(filePath, encoding);
                try
                {
                    return reader.ReadToEnd(); //读取流
                }
                catch
                {
                    return string.Empty;
                }
                finally
                {
                    reader.Close(); //关闭流读取器
                }
            }
    
    
            /// <summary>
            ///     获取指定目录中所有子目录列表,若要搜索嵌套的子目录列表,请使用重载方法.
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            public static string[] GetDirectories(string directoryPath)
            {
                try
                {
                    return Directory.GetDirectories(directoryPath);
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return null;
                }
            }
    
            /// <summary>
            ///     获取指定目录及子目录中所有子目录列表
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            /// <param name="searchPattern">
            ///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。
            ///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。
            /// </param>
            /// <param name="isSearchChild">是否搜索子目录</param>
            public static string[] GetDirectories(string directoryPath, string searchPattern, bool isSearchChild)
            {
                try
                {
                    return Directory.GetDirectories(directoryPath, searchPattern,
                        isSearchChild ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return null;
                }
            }
    
    
            /// <summary>
            ///     从文件的绝对路径中获取扩展名
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static string GetExtension(string filePath)
            {
                var fileInfo = new FileInfo(filePath); //获取文件的名称
                return fileInfo.Extension;
            }
    
    
            /// <summary>
            ///     从文件的绝对路径中获取文件名( 包含扩展名 )
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static string GetFileName(string filePath)
            {
                //获取文件的名称
                var fileInfo = new FileInfo(filePath);
                return fileInfo.Name;
            }
    
    
            /// <summary>
            ///     从文件的绝对路径中获取文件名( 不包含扩展名 )
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static string GetFileNameNoExtension(string filePath)
            {
                //获取文件的名称
                var fileInfo = new FileInfo(filePath);
                return fileInfo.Name.Split('.')[0];
            }
    
    
            /// <summary>
            ///     获取指定目录中所有文件列表
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            public static string[] GetFileNames(string directoryPath)
            {
                if (!IsExistDirectory(directoryPath)) //如果目录不存在,则抛出异常
                    throw new FileNotFoundException();
                return Directory.GetFiles(directoryPath); //获取文件列表
            }
    
            /// <summary>
            ///     获取指定目录及子目录中所有文件列表
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            /// <param name="searchPattern">
            ///     模式字符串,"*"代表0或N个字符,"?"代表1个字符。
            ///     范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。
            /// </param>
            /// <param name="isSearchChild">是否搜索子目录</param>
            public static string[] GetFileNames(string directoryPath, string searchPattern, bool isSearchChild)
            {
                if (!IsExistDirectory(directoryPath)) //如果目录不存在,则抛出异常
                    throw new FileNotFoundException();
                try
                {
                    return Directory.GetFiles(directoryPath, searchPattern,
                        isSearchChild ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return null;
                }
            }
    
    
            /// <summary>
            ///     获取一个文件的长度,单位为Byte
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static int GetFileSize(string filePath)
            {
                //创建一个文件对象
                var fileInfo = new FileInfo(filePath);
    
                //获取文件的大小
                return (int) fileInfo.Length;
            }
    
            /// <summary>
            ///     获取一个文件的长度,单位为KB
            /// </summary>
            /// <param name="filePath">文件的路径</param>
            public static double GetFileSizeByKB(string filePath)
            {
                var fileInfo = new FileInfo(filePath); //创建一个文件对象
                var size = fileInfo.Length / 1024;
                return double.Parse(size.ToString()); //获取文件的大小
            }
    
            /// <summary>
            ///     获取一个文件的长度,单位为MB
            /// </summary>
            /// <param name="filePath">文件的路径</param>
            public static double GetFileSizeByMB(string filePath)
            {
                var fileInfo = new FileInfo(filePath); //创建一个文件对象
                var size = fileInfo.Length / 1024 / 1024;
                return double.Parse(size.ToString()); //获取文件的大小
            }
    
            /// <summary>
            ///     得到文件大小
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static long GetFileSizeFromPath(string filePath = null)
            {
                if (string.IsNullOrEmpty(filePath)) return -1;
                if (!File.Exists(filePath)) return -1;
                var objFile = new FileInfo(filePath);
                return objFile.Length;
            }
    
    
            /// <summary>
            ///     获取文本文件的行数
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static int GetLineCount(string filePath)
            {
                //将文本文件的各行读到一个字符串数组中
                var rows = File.ReadAllLines(filePath);
    
                //返回行数
                return rows.Length;
            }
    
    
            /// <summary>
            ///     检测指定目录是否为空
            /// </summary>
            /// <param name="directoryPath">指定目录的绝对路径</param>
            public static bool IsEmptyDirectory(string directoryPath)
            {
                try
                {
                    //判断是否存在文件
                    var fileNames = GetFileNames(directoryPath);
                    if (fileNames.Length > 0)
                        return false;
    
                    //判断是否存在文件夹
                    var directoryNames = GetDirectories(directoryPath);
                    return directoryNames.Length <= 0;
                }
                catch
                {
                    return false;
                }
            }
    
    
            /// <summary>
            ///     检测指定目录是否存在
            /// </summary>
            /// <param name="directoryPath">目录的绝对路径</param>
            public static bool IsExistDirectory(string directoryPath)
            {
                return Directory.Exists(directoryPath);
            }
    
    
            /// <summary>
            ///     检测指定文件是否存在,如果存在则返回true。
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            public static bool IsExistFile(string filePath)
            {
                return File.Exists(filePath);
            }
    
    
            /// <summary>
            ///     将文件移动到指定目录
            /// </summary>
            /// <param name="sourceFilePath">需要移动的源文件的绝对路径</param>
            /// <param name="descDirectoryPath">移动到的目录的绝对路径</param>
            public static void Move(string sourceFilePath, string descDirectoryPath)
            {
                //获取源文件的名称
                var sourceFileName = GetFileName(sourceFilePath);
    
                if (IsExistDirectory(descDirectoryPath))
                {
                    //如果目标中存在同名文件,则删除
                    if (IsExistFile(descDirectoryPath + "\" + sourceFileName))
                        DeleteFile(descDirectoryPath + "\" + sourceFileName);
                    //将文件移动到指定目录
                    File.Move(sourceFilePath, descDirectoryPath + "\" + sourceFileName);
                }
            }
    
    
            /// <summary>
            ///     将流读取到缓冲区中
            /// </summary>
            /// <param name="stream">原始流</param>
            public static byte[] StreamToBytes(Stream stream)
            {
                try
                {
                    //创建缓冲区
                    var buffer = new byte[stream.Length];
    
                    //读取流
                    stream.Read(buffer, 0, int.Parse(stream.Length.ToString()));
    
                    //返回流
                    return buffer;
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return null;
                }
                finally
                {
                    stream.Close(); //关闭流
                }
            }
    
    
            /// <summary>
            ///     向文本文件中写入内容,默认UTF8编码
            /// </summary>
            /// <param name="filePath">文件的绝对路径</param>
            /// <param name="content">写入的内容</param>
            /// <param name="encoding"></param>
            public static void WriteText(string filePath, string content, Encoding encoding = null)
            {
                if (encoding == null)
                {
                    encoding = Encoding.UTF8;
                }
                File.WriteAllText(filePath, content, encoding); //向文件写入内容
            }
    
            #endregion
    
            /// <summary>   
            /// 重命名文件夹内的所有子文件夹   ============================
            /// </summary>   
            /// <param name="directoryName">文件夹名称</param>   
            /// <param name="newDirectoryName">新子文件夹名称格式字符串</param>   
            public static bool RenameDirectories(string directoryName, string newDirectoryName)
            {
                DirectoryInfo directoryInfo = new DirectoryInfo(directoryName);
                if (!directoryInfo.Exists)
                {
                    return false;
                }
                try
                {
                    int i = 1;
    
                    //string[] sDirectories = Directory.GetDirectories(directoryName);
                    foreach (var sDirectory in directoryInfo.GetDirectories())
                    {
                        string sNewDirectoryName = string.Format(newDirectoryName, i++);
                        string sNewDirectory = Path.Combine(directoryName, sNewDirectoryName);
                        sDirectory.MoveTo(sNewDirectory);
                        // Directory.Move(sDirectory, sNewDirectory);
                    }
                    return true;
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    return false;
                }
            }
    
            /// <summary>
            /// 文件重命名
            /// </summary>
            /// <param name="oldFileName"></param>
            /// <param name="newFileName"></param>
            public static bool FileRename(string filePath, string newFileName)
            {
                FileInfo fileInfo = new FileInfo(filePath); // 列表中的原始文件全路径名
                if (!fileInfo.Exists)
                {
                    return false;
                }
               // fileInfo.DirectoryName 
    
    
               // fileInfo.MoveTo(Path.Combine(newStr));// 改名方法
    
                return true;// 新文件名
            }
        }
    }
  • 相关阅读:
    通用Logging框架设计
    slf4j 与各个 logging框架的适配器说明
    优雅的使用Spring
    Python : 反射
    Python: Tools
    Python : Class
    Python : Module
    Python 入门:基本语法
    docker:版本变更
    Linux: yum配置说明
  • 原文地址:https://www.cnblogs.com/Chary/p/No0000DC.html
Copyright © 2020-2023  润新知