程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#獲得文件夾及文件的年夜小與占用空間的辦法

C#獲得文件夾及文件的年夜小與占用空間的辦法

編輯:C#入門知識

C#獲得文件夾及文件的年夜小與占用空間的辦法。本站提示廣大學習愛好者:(C#獲得文件夾及文件的年夜小與占用空間的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#獲得文件夾及文件的年夜小與占用空間的辦法正文


本文具體引見了應用C#完成依據途徑,盤算這個途徑所占用的磁盤空間的辦法 。

網上有許多材料都是獲得文件夾/文件的年夜小的。關於占用空間的很少有完全的代碼。這裡引見完成這一功效的完全代碼,供年夜家參考一下。

起首說下文件夾/文件年夜小與占用空間的差別。

這個是硬盤分區格局有關 年夜小是文件的現實年夜小,而占用空間是占硬盤的現實空間 以FAT32格局為例,硬盤的根本存儲單元是簇,在FAT32中一簇是4KB 那末,也就是說即便文件只要1個字節,在硬盤上也要占到4KB的空間 假如文件是4KB零1個字節,那就要占用8KB的空間,以此類推。

結論: 年夜小是文件的現實年夜小,而占用空間是占硬盤的現實空間。

那末成績來了。如何獲得本機的簇有若干字節呢?

起首可以經由過程windows API獲得磁盤的相干信息。

//挪用windows API獲得磁盤余暇空間
//導入庫
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
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="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;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved