磁盘大小是文件在驱动器上占用的实际大小,具体取决于群集大小(或分配单元),大多数情况下为 4KB,但并非所有时间。这取决于文件格式及其格式化方式。
只要文件没有被压缩,问题就在于找出适合每个文件需要多少块集群。请记住,如果文件小于集群大小,它将占用一个分配单元。
如果文件被压缩,则信息不易获得,需要通过 API 检索。
以下代码分为 3 个主要部分:
- 它定义了一个用于访问
GetCompressedFileSizeAPI
kernel.dll 中的函数的类型。此函数将检索文件在磁盘上的压缩大小。
- 它使用 WMI 来确定给定的集群大小
$path
- 它计算文件夹和子文件夹中文件的磁盘大小,
$path
具体取决于文件是否被压缩。
请注意,调用Get-ChildItem
使用-force
开关来确保我们也检索隐藏文件和系统文件。
我不确定此代码是否适用于 Skydrive,因此您可能需要更改 WMI 部分。
$path = '.\'
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
public class FileInfo
{
[DllImport("kernel32.dll", SetLastError=true, EntryPoint="GetCompressedFileSize")]
static extern uint GetCompressedFileSizeAPI(string lpFileName, out uint lpFileSizeHigh);
public static ulong GetCompressedFileSize(string strFileName)
{
uint intHigh;
uint intLow;
intLow = GetCompressedFileSizeAPI(strFileName, out intHigh);
int intError = Marshal.GetLastWin32Error();
if (intHigh == 0 && intLow == 0xFFFFFFFF && intError != 0)
throw new Win32Exception(intError);
else
return ((ulong)intHigh << 32) + intLow;
}
}
"@
$files = Get-ChildItem $path -Recurse -force | where {$_.PSIsContainer -eq $false}
$drive = [string]$files[0].PSdrive+':'
$wql = "SELECT Blocksize FROM Win32_Volume where DriveLetter='$drive'"
$driveinfo = Get-WmiObject -Query $wql -ComputerName '.'
$sizeondisk = ($files | %{
if ($_.Attributes -like "*compressed*")
{
if ($_.length -lt $driveinfo.BlockSize -and $_.length -ne 0)
{
$driveinfo.BlockSize
}
else
{
[FileInfo]::GetCompressedFileSize($_.fullname)
}
}
else
{
if ($_.length -lt $driveinfo.BlockSize -and $_.length -ne 0)
{
$driveinfo.BlockSize
}
else
{
([math]::ceiling($_.length/$driveinfo.BlockSize))*$driveinfo.BlockSize
}
}
}|Measure -sum).sum
$sizeondisk
更新稀疏文件:
让我们看看这个版本是否适用于稀疏文件,将这段代码添加到之前代码的末尾,保持其他所有内容相同:
$sparsesize = ($files | %{
if ($_.length -lt $driveinfo.BlockSize -and $_.length -ne 0)
{
$driveinfo.BlockSize
}
else
{
$_.fullname
[FileInfo]::GetCompressedFileSize($_.fullname)
}
}|Measure -sum).sum
$sparsesize
资料来源:
了解 NTFS 压缩
帮助查询文件返回 SIZE on DISK
压缩文件的大小(法语)
如何从 PowerShell 获取文件的实际磁盘大小?
NTFS、FAT 和 exFAT 的默认簇大小