using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices; namespace demo.ClassHelper.DirectoryOperate { class DirectoryOperate { /// /// 调用WinApi获取磁盘空闲空间 /// /// /// /// /// /// /// [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern bool GetDiskFreeSpace([MarshalAs(UnmanagedType.LPTStr)]string rootPathName, ref int sectorsPerCluster, ref int bytesPerSector, ref int numberOfFreeClusters, ref int totalNumbeOfClusters); /// /// 获取指定路径的大小 /// /// 路径 /// public static long GetDirectoryLength(string dirPath) { long len = 0; //判断该路径是否存在(是否为文件夹) if (!Directory.Exists(dirPath)) { //查询文件的大小 len = FileSize(dirPath); } else { //定义一个DirectoryInfo对象 DirectoryInfo di = new DirectoryInfo(dirPath); //通过GetFiles方法,获取di目录中的所有文件的大小 foreach (FileInfo fi in di.GetFiles()) { len += fi.Length; } //获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归 DirectoryInfo[] dis = di.GetDirectories(); if (dis.Length > 0) { for (int i = 0; i < dis.Length; i++) { len += GetDirectoryLength(dis[i].FullName); } } } return len; } /// /// 删除文件夹 /// /// public static void DelectDir(string srcPath) { try { DirectoryInfo dir = new DirectoryInfo(srcPath); FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //返回目录中所有文件和子目录 foreach (FileSystemInfo i in fileinfo) { if (i is DirectoryInfo) //判断是否文件夹 { DirectoryInfo subdir = new DirectoryInfo(i.FullName); subdir.Delete(true); //删除子目录和文件 } else { File.Delete(i.FullName); //删除指定文件 } } } catch { } } public static void DeleteAppointedDir(string path, double day) { try { var file = Directory.GetDirectories(path).Select(d => new DirectoryInfo(d)) .Where(d => d.CreationTime < DateTime.Now.AddDays(-day) && d.GetFiles().Length > 0); foreach (var s in file) { s.Delete(); } } catch { } } public static void DeleteAppointedFile(string path, double day) { DirectoryInfo dyInfo = new DirectoryInfo(path); //获取文件夹下所有的文件 foreach (FileInfo feInfo in dyInfo.GetFiles()) { //判断文件日期是否小于今天,是则删除 if (feInfo.CreationTime < DateTime.Now.AddDays(-day)) feInfo.Delete(); } } /// /// 获取指定路径的占用空间 /// /// 路径 /// public static long GetDirectorySpace(string dirPath) { //返回值 long len = 0; //判断该路径是否存在(是否为文件夹) if (!Directory.Exists(dirPath)) { //如果是文件,则调用 len = FileSpace(dirPath); } else { //定义一个DirectoryInfo对象 DirectoryInfo di = new DirectoryInfo(dirPath); //本机的簇值 long clusterSize = GetClusterSize(di); //遍历目录下的文件,获取总占用空间 foreach (FileInfo fi in di.GetFiles()) { //文件大小除以簇,余若不为0 if (fi.Length % clusterSize != 0) { decimal res = fi.Length / clusterSize; //文件大小除以簇,取整数加1。为该文件占用簇的值 int clu = Convert.ToInt32(Math.Ceiling(res)) + 1; long result = clusterSize * clu; len += result; } else { //余若为0,则占用空间等于文件大小 len += fi.Length; } } //获取di中所有的文件夹,并存到一个新的对象数组中,以进行递归 DirectoryInfo[] dis = di.GetDirectories(); if (dis.Length > 0) { for (int i = 0; i < dis.Length; i++) { len += GetDirectorySpace(dis[i].FullName); } } } return len; } //所给路径中所对应的文件大小 public static long FileSize(string filePath) { //定义一个FileInfo对象,是指与filePath所指向的文件相关联,以获取其大小 FileInfo fileInfo = new FileInfo(filePath); return fileInfo.Length; } //所给路径中所对应的文件占用空间 public static long FileSpace(string filePath) { long temp = 0; //定义一个FileInfo对象,是指与filePath所指向的文件相关联,以获取其大小 FileInfo fileInfo = new FileInfo(filePath); long clusterSize = GetClusterSize(fileInfo); if (fileInfo.Length % clusterSize != 0) { decimal res = fileInfo.Length / clusterSize; int clu = Convert.ToInt32(Math.Ceiling(res)) + 1; temp = clusterSize * clu; } else { return fileInfo.Length; } return temp; } public static DiskInfo GetDiskInfo(string rootPathName) { DiskInfo diskInfo = new DiskInfo(); int sectorsPerCluster = 0, bytesPerSector = 0, numberOfFreeClusters = 0, totalNumberOfClusters = 0; GetDiskFreeSpace(rootPathName, ref sectorsPerCluster, ref bytesPerSector, ref numberOfFreeClusters, ref totalNumberOfClusters); //每簇的扇区数 diskInfo.SectorsPerCluster = sectorsPerCluster; //每扇区字节 diskInfo.BytesPerSector = bytesPerSector; return diskInfo; } //// /// 结构。硬盘信息 /// public struct DiskInfo { // public string RootPathName; //每簇的扇区数 public int SectorsPerCluster; //每扇区字节 public int BytesPerSector; //public int NumberOfFreeClusters; //public int TotalNumberOfClusters; } /// /// 获取每簇的字节 /// /// 指定文件 /// public static long GetClusterSize(FileInfo file) { long clusterSize = 0; DiskInfo diskInfo = new DiskInfo(); diskInfo = GetDiskInfo(file.Directory.Root.FullName); clusterSize = (diskInfo.BytesPerSector * diskInfo.SectorsPerCluster); return clusterSize; } /// /// 获取每簇的字节 /// /// 指定目录 /// public static long GetClusterSize(DirectoryInfo dir) { long clusterSize = 0; DiskInfo diskInfo = new DiskInfo(); diskInfo = GetDiskInfo(dir.Root.FullName); clusterSize = (diskInfo.BytesPerSector * diskInfo.SectorsPerCluster); return clusterSize; } public static bool GetFiles(string dirPath, string patten, ref List fileList) { if (!Directory.Exists(dirPath) || patten == string.Empty) { return false; } try { DirectoryInfo dirInfo = new DirectoryInfo(dirPath); foreach (FileInfo info in dirInfo.GetFiles()) { fileList.Add(info.Name.Split('.')[0]); } return true; } catch (System.Exception ex) { string str = ex.ToString(); return false; } } } }