Размер на диске фактический размер, что ваши файлы занимают на диске в зависимости от размера кластера (или единицы выделения), который большую часть времени является 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
UPDATE для разреженных файлов:
Давайте посмотрим, если эта версия работает с разреженными файлами, добавьте этот блок кода в конце предыдущего кода, держать все остальное то же самое:
$sparsesize = ($files | %{
if ($_.length -lt $driveinfo.BlockSize -and $_.length -ne 0)
{
$driveinfo.BlockSize
}
else
{
$_.fullname
[FileInfo]::GetCompressedFileSize($_.fullname)
}
}|Measure -sum).sum
$sparsesize
Источники:
Understanding NTFS compression
Help querying files to return SIZE on DISK
Size of compressed files (in French)
How to get the actual size-on-disk of a file from PowerShell?
Default cluster size for NTFS, FAT, and exFAT
Вы можете найти это полезным: http://stackoverflow.com/questions/16178919/powershell-get-diskusage-cmdlet-how-to-list-from-a-different-drive-directory –
Прочтите это для " размер на диске "info http://stackoverflow.com/questions/13959228/file-size-actual-number-of-bytes-used-on-disk-not-allocated –