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;// 新文件名 }} }
?