Это потому, что 4K является размером кластера по умолчанию для дисков до 16 ТБ.Поэтому при выборе размера буфера имеет смысл выделить буфер в кратных размерах кластера.
Кластер - это наименьшая единица выделения для файла, поэтому, если файл содержит только 1 байт, он будет занимать 4 КБ.физического дискового пространства.И файл 5K приведет к выделению 8K. Обновление : добавлен пример кода для получения размера кластера диска
using System;
using System.Runtime.InteropServices;
class Program
{
[DllImport("kernel32", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetDiskFreeSpace(
string rootPathName,
out int sectorsPerCluster,
out int bytesPerSector,
out int numberOfFreeClusters,
out int totalNumberOfClusters);
static void Main(string[] args)
{
int sectorsPerCluster;
int bytesPerSector;
int numberOfFreeClusters;
int totalNumberOfClusters;
if (GetDiskFreeSpace("C:\\",
out sectorsPerCluster,
out bytesPerSector,
out numberOfFreeClusters,
out totalNumberOfClusters))
{
Console.WriteLine("Cluster size = {0} bytes",
sectorsPerCluster * bytesPerSector);
}
else
{
Console.WriteLine("GetDiskFreeSpace Failed: {0:x}",
Marshal.GetLastWin32Error());
}
Console.ReadKey();
}
}