using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Security.AccessControl; using System.Security.Cryptography; using System.Text; namespace RunUpdater.Lib { public class FileHelper { public enum FilePower { FullControl = 0, ReadOnly = 1, Write = 2, Modify = 3 } /// /// 计算指定文件MD5 /// /// 文件路径 /// 返回MD5 public static string GetMD5ByMD5CryptoService(string FilePath) { try { FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read); MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider(); byte[] buffer = md5Provider.ComputeHash(fs); string resule = BitConverter.ToString(buffer); resule = resule.Replace("-", ""); md5Provider.Clear(); fs.Close(); return resule; } catch { return ""; } } /// ///计算指定大文件MD5 /// /// 文件地址 /// 返回MD5 public static string GetMD5ByHashAlgorithm(string FilePath) { try { int bufferSize = 1024 * 16;//自定义缓冲区大小16K byte[] buffer = new byte[bufferSize]; Stream inputStream = File.Open(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read); HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider(); int readLength = 0;//每次读取长度 var output = new byte[bufferSize]; while ((readLength = inputStream.Read(buffer, 0, buffer.Length)) > 0) { //计算MD5 hashAlgorithm.TransformBlock(buffer, 0, readLength, output, 0); } //完成最后计算,必须调用(由于上一部循环已经完成所有运算,所以调用此方法时后面的两个参数都为0) hashAlgorithm.TransformFinalBlock(buffer, 0, 0); string md5 = BitConverter.ToString(hashAlgorithm.Hash); hashAlgorithm.Clear(); inputStream.Close(); md5 = md5.Replace("-", ""); return md5; } catch { return ""; } } /// /// 字节转换为GB、MB、KB、B /// /// 待转换字节数值 /// 返回转换结果GB、MB、KB、B public static string ConvertSize(long byteSize) { int unit = 1024; if (byteSize < unit) return byteSize + " B"; int exp = (int)(Math.Log(byteSize) / Math.Log(unit)); return $"{byteSize / Math.Pow(unit, exp):F2}{"KMGTPE"[exp - 1]}B"; } #region 文件操作 /// /// 删除指定目录下的所有文件及文件夹 /// /// 待删除目录 /// 是否保留目录 /// 删除结果 public static bool DeleteDir(string strPath, bool isReservedDir = true) { try { // 清除空格 strPath = @strPath.Trim().ToString(); // 判断文件夹是否存在 if (Directory.Exists(strPath)) { // 获得文件夹数组 string[] strDirs = Directory.GetDirectories(strPath); // 获得文件数组 string[] strFiles = Directory.GetFiles(strPath); // 遍历所有子文件夹 foreach (string strFile in strFiles) { // 删除文件 File.Delete(strFile); } // 遍历所有文件 foreach (string strdir in strDirs) { // 删除文件夹 Directory.Delete(strdir, true); } if (!isReservedDir) { Directory.Delete(strPath); } } // 成功 return true; } catch (Exception) // 异常处理 { // 失败 return false; } } /// /// 删除指定目录下的指定后缀名的文件 /// /// 要删除的文件所在的目录,是绝对目录,如d:\temp /// 要删除的文件的后缀名的一个数组,比如masks中包含了.cs,.vb,.c这三个元素 /// 表示是否需要递归删除,即是否也要删除子目录中相应的文件 /// 表示是否忽略隐藏文件 /// 表示总共删除的文件数 public static bool DeleteFiles(string directory, string[] masks, bool searchSubdirectories, bool ignoreHidden, ref int deletedFileCount) { try { //先删除当前目录下指定后缀名的所有文件 foreach (string file in Directory.GetFiles(directory, "*.*")) { if (!(ignoreHidden && (File.GetAttributes(file) & FileAttributes.Hidden) == FileAttributes.Hidden)) { foreach (string mask in masks) { if (Path.GetExtension(file) == mask) { File.Delete(file); deletedFileCount++; } } } } //如果需要对子目录进行处理,则对子目录也进行递归操作 if (searchSubdirectories) { string[] childDirectories = Directory.GetDirectories(directory); foreach (string dir in childDirectories) { if (!(ignoreHidden && (File.GetAttributes(dir) & FileAttributes.Hidden) == FileAttributes.Hidden)) { DeleteFiles(dir, masks, searchSubdirectories, ignoreHidden, ref deletedFileCount); } } } } catch (Exception) { return false; } return true; } /// /// 删除指定目录下的指定后缀名的文件 /// /// 要删除的文件所在的目录,是绝对目录,如d:\temp /// 要删除的文件的后缀名的一个数组,比如masks中包含了.cs,.vb,.c这三个元素 /// 表示是否需要递归删除,即是否也要删除子目录中相应的文件 /// 表示是否忽略隐藏文件 /// /// 表示总共删除的文件数 public static void DeleteFiles(string directory, string[] masks, bool searchSubdirectories, bool ignoreHidden, int delDay, ref int deletedFileCount) { //先删除当前目录下指定后缀名的所有文件 foreach (string file in Directory.GetFiles(directory, "*.*")) { if (!(ignoreHidden && (File.GetAttributes(file) & FileAttributes.Hidden) == FileAttributes.Hidden)) { foreach (string mask in masks) { if (Path.GetExtension(file) == mask) { FileInfo _FileInfo = new FileInfo(file); if (_FileInfo.LastWriteTime < DateTime.Now.Date.AddDays(-1 * delDay)) { _FileInfo.Delete(); deletedFileCount++; } } } } } //如果需要对子目录进行处理,则对子目录也进行递归操作 if (searchSubdirectories) { string[] childDirectories = Directory.GetDirectories(directory); foreach (string dir in childDirectories) { if (!(ignoreHidden && (File.GetAttributes(dir) & FileAttributes.Hidden) == FileAttributes.Hidden)) { DeleteFiles(dir, masks, searchSubdirectories, ignoreHidden, delDay, ref deletedFileCount); } } } } /// /// 拷贝文件至指定目标目录 /// /// 源文件目录(@"~\labs\oldlab") /// 保存的目标目录(@"~\labs\newlab") /// 返回:true-拷贝成功;false:拷贝失败 public static bool CopyOldFilesToNewFiles(string sourcePath, string savePath) { if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } try { string[] labDirs = Directory.GetDirectories(sourcePath);//目录 string[] labFiles = Directory.GetFiles(sourcePath);//文件 if (labFiles.Length > 0) { for (int i = 0; i < labFiles.Length; i++) { if (Path.GetFileName(labFiles[i]) != "lpk.dll")//排除.lab文件 { if (labFiles[i].EndsWith(".rar", true, null)) { File.Copy(sourcePath + "\\" + Path.GetFileName(labFiles[i]), savePath + "\\" + Path.GetFileName(labFiles[i].Substring(0, labFiles[i].ToLower().LastIndexOf(".rar"))), true); } else { File.Copy(sourcePath + "\\" + Path.GetFileName(labFiles[i]), savePath + "\\" + Path.GetFileName(labFiles[i]), true); } } } } if (labDirs.Length > 0) { for (int j = 0; j < labDirs.Length; j++) { Directory.GetDirectories(sourcePath + "\\" + Path.GetFileName(labDirs[j])); //递归调用 CopyOldFilesToNewFiles(sourcePath + "\\" + Path.GetFileName(labDirs[j]), savePath + "\\" + Path.GetFileName(labDirs[j])); } } } catch (Exception) { return false; } return true; } /// /// 拷贝文件至指定目标目录 /// /// 源文件目录(@"~\labs\oldlab") /// 保存的目标目录(@"~\labs\newlab") /// 保存的目标后缀 /// 返回:true-拷贝成功;false:拷贝失败 public static bool CopyOldFilesToNewFiles(string sourcePath, string savePath, string Extension = "") { if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } try { string[] labDirs = Directory.GetDirectories(sourcePath);//目录 string[] labFiles = Directory.GetFiles(sourcePath);//文件 if (labFiles.Length > 0) { for (int i = 0; i < labFiles.Length; i++) { if (Path.GetFileName(labFiles[i]) != "lpk.dll")//排除lpk.dll文件 { if (labFiles[i].EndsWith(Extension)) { File.Copy(sourcePath + "\\" + Path.GetFileName(labFiles[i]), savePath + "\\" + Path.GetFileName(labFiles[i]), true); } else { File.Copy(sourcePath + "\\" + Path.GetFileName(labFiles[i]), savePath + "\\" + Path.GetFileName(labFiles[i]) + Extension, true); } } } } if (labDirs.Length > 0) { for (int j = 0; j < labDirs.Length; j++) { Directory.GetDirectories(sourcePath + "\\" + Path.GetFileName(labDirs[j])); //递归调用 CopyOldFilesToNewFiles(sourcePath + "\\" + Path.GetFileName(labDirs[j]), savePath + "\\" + Path.GetFileName(labDirs[j]), Extension); } } } catch (Exception) { return false; } return true; } /// /// 返回指定目录下的所有文件信息 /// /// /// public List GetAllFilesInDirectory(string strDirectory) { //判断文件夹是否存在,不存在则退出 if (!Directory.Exists(strDirectory)) return null; List listFiles = new List(); //保存所有的文件信息 DirectoryInfo directory = new DirectoryInfo(strDirectory); DirectoryInfo[] directoryArray = directory.GetDirectories(); FileInfo[] fileInfoArray = directory.GetFiles(); if (fileInfoArray.Length > 0) listFiles.AddRange(fileInfoArray); foreach (DirectoryInfo _directoryInfo in directoryArray) { DirectoryInfo directoryA = new DirectoryInfo(_directoryInfo.FullName); DirectoryInfo[] directoryArrayA = directoryA.GetDirectories(); FileInfo[] fileInfoArrayA = directoryA.GetFiles(); if (fileInfoArrayA.Length > 0) listFiles.AddRange(fileInfoArrayA); GetAllFilesInDirectory(_directoryInfo.FullName);//递归遍历 } return listFiles; } /// /// 获取所有目录即子目录下的文件总字节大小 /// /// 返回指定目录下的所有文件信息 /// 返回值 private static long GetUpdateSize(List listFileInfo) { long len = 0; if (listFileInfo != null) { foreach (FileInfo fileInfo in listFileInfo) { if (fileInfo.Name != "lpk.dll") { len += fileInfo.Length; } } } return len; } #endregion /// /// 为创建的临时文件分配权限 /// /// /// /// public static void AddpathPower(string pathname, string username, string power) { DirectoryInfo dirinfo = new DirectoryInfo(pathname); if ((dirinfo.Attributes & FileAttributes.ReadOnly) != 0) { dirinfo.Attributes = FileAttributes.Normal; } //取得访问控制列表 DirectorySecurity dirsecurity = dirinfo.GetAccessControl(); switch (power) { case "FullControl": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow)); break; case "ReadOnly": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Read, AccessControlType.Allow)); break; case "Write": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Write, AccessControlType.Allow)); break; case "Modify": dirsecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.Modify, AccessControlType.Allow)); break; } } /// ///为文件夹添加users,everyone用户组的完全控制权限 /// /// public static void AddSecurityControll2Folder(string dirPath) { //获取文件夹信息 DirectoryInfo dir = new DirectoryInfo(dirPath); //获得该文件夹的所有访问权限 DirectorySecurity dirSecurity = dir.GetAccessControl(AccessControlSections.All); //设定文件ACL继承 InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; //添加ereryone用户组的访问权限规则 完全控制权限 FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); //添加Users用户组的访问权限规则 完全控制权限 FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow); bool isModified = false; dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out isModified); dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified); //设置访问权限 dir.SetAccessControl(dirSecurity); } } }