|
|
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
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 调用WinApi获取磁盘空闲空间
|
|
|
/// </summary>
|
|
|
/// <param name="rootPathName"></param>
|
|
|
/// <param name="sectorsPerCluster"></param>
|
|
|
/// <param name="bytesPerSector"></param>
|
|
|
/// <param name="numberOfFreeClusters"></param>
|
|
|
/// <param name="totalNumbeOfClusters"></param>
|
|
|
/// <returns></returns>
|
|
|
[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);
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取指定路径的大小
|
|
|
/// </summary>
|
|
|
/// <param name="dirPath">路径</param>
|
|
|
/// <returns></returns>
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 删除文件夹
|
|
|
/// </summary>
|
|
|
/// <param name="srcPath"></param>
|
|
|
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();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取指定路径的占用空间
|
|
|
/// </summary>
|
|
|
/// <param name="dirPath">路径</param>
|
|
|
/// <returns></returns>
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
//// <summary>
|
|
|
/// 结构。硬盘信息
|
|
|
/// </summary>
|
|
|
public struct DiskInfo
|
|
|
{
|
|
|
// public string RootPathName;
|
|
|
//每簇的扇区数
|
|
|
public int SectorsPerCluster;
|
|
|
//每扇区字节
|
|
|
public int BytesPerSector;
|
|
|
//public int NumberOfFreeClusters;
|
|
|
//public int TotalNumberOfClusters;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取每簇的字节
|
|
|
/// </summary>
|
|
|
/// <param name="file">指定文件</param>
|
|
|
/// <returns></returns>
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取每簇的字节
|
|
|
/// </summary>
|
|
|
/// <param name="dir">指定目录</param>
|
|
|
/// <returns></returns>
|
|
|
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<string> 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;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|