using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace HPNetwork.FileOperations { /// /// 文件操作类 /// public class FileOperation { /// /// 删除文件夹下所有文件 /// /// public bool DeleteFolder(string dir) { string _message = ""; return DeleteFolder(dir, out _message); } /// /// 删除文件夹下所有文件 /// /// /// /// public bool DeleteFolder(string dir,out string message) { bool bl = false; //如果存在这个文件夹删除之 if (Directory.Exists(dir)) { foreach (string d in Directory.GetFileSystemEntries(dir)) { if (File.Exists(d)) File.Delete(d);//直接删除其中的文件 else DeleteFolder(d, out message);//递归删除子文件夹 } Directory.Delete(dir); //删除已空文件夹 message = (dir + "文件夹删除成功"); bl = true; } else {//如果文件夹不存在则提示 message = (dir + "该文件夹不存在"); bl = false; } return bl; } /// /// 实现一个静态方法将指定文件夹下面的所有内容Detele /// 测试的时候要小心操作,删除之后无法恢复。 /// /// /// 是否删除指定文件夹自己 /// public static void DeleteDir(string aimPath, bool isDeleteOwn=false) { try { //检查目标目录是否以目录分割字符结束如果不是则添加之 if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar) aimPath += Path.DirectorySeparatorChar; //得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组 //如果你指向Delete目标文件下面的文件而不包含目录请使用下面的方法 //string[]fileList= Directory.GetFiles(aimPath); string[] fileList = Directory.GetFileSystemEntries(aimPath); //遍历所有的文件和目录 foreach (string file in fileList) { //先当作目录处理如果存在这个 //目录就递归Delete该目录下面的文件 if (Directory.Exists(file)) { DeleteDir(aimPath + Path.GetFileName(file)); } //否则直接Delete文件 else { File.Delete(aimPath + Path.GetFileName(file)); } } //删除文件夹 if (!isDeleteOwn) { DirectoryInfo dirInfo = new DirectoryInfo(aimPath); //取得源文件夹下的所有子文件夹名称 DirectoryInfo[] ZiPath = dirInfo.GetDirectories(); for (int j = 0; j < ZiPath.Length; j++) { //获取子文件夹名 string strZiPath = aimPath + "\\" + ZiPath[j].ToString(); //删除当前文件夹 System.IO.Directory.Delete(strZiPath, true); } } else { System.IO.Directory.Delete(aimPath, true); } } catch (Exception e) { throw new Exception(e.Message); } } /// /// 拷贝文件夹(包括子文件夹)到指定文件夹下 /// 文件和文件夹分开复制,当是文件夹则递归复制 ///源文件夹和目标文件夹均需绝对路径 ///格式:CopyFolder(源文件夹,目标文件夹) /// /// 待复制地址 /// 目标地址 public static void CopyFolder(string strFromPath, string strToPath, bool overwrite = false) { //如果源文件夹不存在,则创建 if (!Directory.Exists(strFromPath)) { Directory.CreateDirectory(strFromPath); } //取得要拷贝的文件夹名 string strFolderName = strFromPath.Substring( strFromPath.LastIndexOf("\\") + 1, strFromPath.Length - strFromPath.LastIndexOf("\\") - 1); //如果目标文件夹中没有源文件夹 //则在目标文件夹中创建源文件夹 if (!Directory.Exists( strToPath + "\\" + strFolderName)) { Directory.CreateDirectory( strToPath + "\\" + strFolderName); } //创建数组保存源文件夹下的文件名 string[] strFiles = Directory.GetFiles(strFromPath); //循环拷贝文件 for (int i = 0; i < strFiles.Length; i++) { //取得拷贝的文件名,只取文件名,地址截掉。 string strFileName = strFiles[i].Substring( strFiles[i].LastIndexOf("\\") + 1, strFiles[i].Length - strFiles[i].LastIndexOf("\\") - 1); string copyToPath = strToPath + "\\" + strFolderName + "\\" + strFileName; if (overwrite || !System.IO.File.Exists(copyToPath)) { //开始拷贝文件,true表示覆盖同名文件 File.Copy( strFiles[i], copyToPath, true); } else if (System.IO.File.Exists(copyToPath)) { try { string fileMd51 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(copyToPath); string fileMd52 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(strFiles[i]); if (fileMd51 != fileMd52) { try { System.IO.File.Move(copyToPath, strToPath + "\\" + strFolderName + "\\[oldfile_" + DateTime.Now.ToString("yyyy-MM-dd") + "]" + strFileName); } catch { } //开始拷贝文件,true表示覆盖同名文件 File.Copy( strFiles[i], copyToPath, true); } } catch { } } } //创建DirectoryInfo实例 DirectoryInfo dirInfo = new DirectoryInfo(strFromPath); //取得源文件夹下的所有子文件夹名称 DirectoryInfo[] ZiPath = dirInfo.GetDirectories(); for (int j = 0; j < ZiPath.Length; j++) { //获取所有子文件夹名 string strZiPath = strFromPath + "\\" + ZiPath[j].ToString(); //把得到的子文件夹当成新的 //源文件夹,从头开始新一轮的拷贝 CopyFolder( strZiPath, strToPath + "\\" + strFolderName); } } public static void CopyFile(string srcFile, string toDirPath, bool overwrite = false) { //取得拷贝的文件名,只取文件名,地址截掉。 string strFileName = srcFile.Substring( srcFile.LastIndexOf("\\") + 1, srcFile.Length - srcFile.LastIndexOf("\\") - 1); string copyToPath = toDirPath + "\\" + "\\" + strFileName; if (overwrite || !System.IO.File.Exists(copyToPath)) { //开始拷贝文件,true表示覆盖同名文件 File.Copy( srcFile, copyToPath, true); } else if (System.IO.File.Exists(copyToPath)) { try { string fileMd51 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(copyToPath); string fileMd52 = LYFZ.WinAPI.SDKSecurity.GetMD5HashFromFile(srcFile); if (fileMd51 != fileMd52) { try { System.IO.File.Move(copyToPath, toDirPath + "\\[oldfile_" + DateTime.Now.ToString("yyyy-MM-dd") + "]" + strFileName); } catch { } //开始拷贝文件,true表示覆盖同名文件 File.Copy( srcFile, copyToPath, true); } } catch { } } } /// /// 实现一个静态方法将指定文件夹下面的所有 /// 内容copy到目标文件夹下面 /// 如果目标文件夹为只读属性就会报错 /// /// 源文件件 /// 目的文件夹 public void CopyDir(string srcPath, string aimPath) { try { //检查目标目录是否以目录分割字符 //结束如果不是则添加之 if (aimPath[aimPath.Length - 1] != Path.DirectorySeparatorChar) aimPath += Path.DirectorySeparatorChar; //判断目标目录是否存在如果不存在则新建之 if (!Directory.Exists(aimPath)) Directory.CreateDirectory(aimPath); //得到源目录的文件列表,该里面是包含 //文件以及目录路径的一个数组 //如果你指向copy目标文件下面的文件 //而不包含目录请使用下面的方法 //string[]fileList= Directory.GetFiles(srcPath); string[] fileList = Directory.GetFileSystemEntries(srcPath); //遍历所有的文件和目录 foreach (string file in fileList) { //先当作目录处理如果存在这个 //目录就递归Copy该目录下面的文件 if (Directory.Exists(file)) CopyDir( file, aimPath + Path.GetFileName(file)); //否则直接Copy文件 else File.Copy( file, aimPath + Path.GetFileName(file), true); } } catch (Exception e) { throw new Exception(e.Message); } } #region 增加文件操作方法 2017-03-17 杨云奕 添加 /// /// 检查文件夹是否存在 /// /// /// public static bool CheckAndCreateDirectory(string dirPath) { try { if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } return true; } catch { return false; } } /// /// 读取文件 /// /// /// public static string ReadFile(string filePaht) { if (File.Exists(filePaht)) { return File.ReadAllText(filePaht); } else { return ""; } } /// /// 写入文件 /// /// /// public static void WriteFile(string filePath,string txt) { string dir = Path.GetDirectoryName(filePath); if(CheckAndCreateDirectory(dir)) { File.WriteAllText(filePath, txt); } } /// /// 写入附加文件 /// /// /// public static void WriteAppendFile(string filePath, string txt) { string dir = Path.GetDirectoryName(filePath); if (CheckAndCreateDirectory(dir)) { File.AppendAllText(filePath, txt); } } /// /// 文件夹中的文件 /// /// /// public static string[] GetDirectoryFile(string dir) { if (!Directory.Exists(dir)) { CheckAndCreateDirectory(dir); } return Directory.GetFiles(dir); } #endregion } }