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;
}
}
}
}