using System; using System.Diagnostics; using System.IO; using System.Text; using Shared;namespace 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;// 新文件名 }} }