4kb缓冲长度有什么特别之处?

she*_*tie 6 .net io buffer

在.NET中执行文件IO时,似乎95%的示例使用4096字节缓冲区.4kb缓冲长度有什么特别之处?或者它只是在for循环中使用i作为索引的约定?

Chr*_*lor 8

这是因为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)