在.NET中执行文件IO时,似乎95%的示例使用4096字节缓冲区.4kb缓冲长度有什么特别之处?或者它只是在for循环中使用i作为索引的约定?
这是因为4K是高达16TB的磁盘的默认簇大小.因此,在选择缓冲区大小时,将缓冲区分配为簇大小的倍数是有意义的.
群集是文件的最小分配单位,因此如果文件只包含1个字节,则会占用4K的物理磁盘空间.并且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();
}
}
Run Code Online (Sandbox Code Playgroud)