当前位置: 首页> 房产> 建材 > 上海公司牌照最新价格_移动端设计规范_国际新闻最新消息今天_济南做网站比较好的公司

上海公司牌照最新价格_移动端设计规范_国际新闻最新消息今天_济南做网站比较好的公司

时间:2025/7/11 13:47:53来源:https://blog.csdn.net/weixin_41863029/article/details/143865478 浏览次数:0次
上海公司牌照最新价格_移动端设计规范_国际新闻最新消息今天_济南做网站比较好的公司

       获取磁盘信息是一个常见需求,如检查磁盘预留空间,开发磁盘碎片整理工具,系统性能优化等工具等。

        Windows 为此提供了各种接口,今天我们主要讲讲常用相关的三个API :

  • GetDiskFreeSpace
  • GetDiskFreeSpaceEx
  • GetDiskSpaceInformation

        如果你只是想获取磁盘空间总大小、剩余空间大小,那么很简单,直接调用 GetDiskFreeSpaceEx 即可,完。

        如果你还有进一步的获取磁盘信息的需求,请继续浏览下文。

        首先,让我们简单回顾下关于磁盘的基础知识。

扇区、簇、磁道和柱面

扇区(Sector)

  •    扇区是硬盘上最小的可寻址存储单位。
  •    硬盘读写操作的基本单位就是扇区。
  •    通常大小为512字节或更大(如4096字节)。这个值反映了磁盘的物理特性。
  •    扇区包含数据和错误检测与校正(ECC)信息,以确保数据的完整性。

簇(Cluster)

  •    簇是文件系统的最小分配单位。
  •    由一个或多个扇区组成,常见值:1、2、4、8、16、32、64 等扇区数。
  •    簇的大小通常在创建分区时设置,由文件系统和硬盘分区的大小决定。
  •    簇的大小会影响存储效率。

磁道(Track)

  •    磁道是硬盘上圆形的存储区域,是硬盘表面被划分的同心圆。每个磁道包含多个扇区。
  •    磁道是硬盘上物理存储数据的连续区域,磁头在读取或写入数据时会沿着磁道移动。
  •    由于磁道的外圈比内圈长,因此外圈的磁道可以存储更多的数据。

柱面(Cylinder)

  •   柱面是硬盘上所有具有相同编号的磁道组成的集合。在硬盘上,所有磁头可以同时读写相同编号的磁道,这些磁道就组成了一个柱面。
  •   柱面是硬盘上数据存储的逻辑单位,它允许磁头同时访问不同盘片上的相同位置。
  •   柱面的数量等于硬盘上磁头的数量乘以每面盘片的磁道数。

        以上是硬盘存储和数据组织的基础,了解它们有助于更好地理解硬盘的工作原理和数据存储方式,它们是硬盘数据存储和访问的基本结构。

        下面让我们通过以下三个不同的API分别获取磁盘的不同信息。

GetDiskFreeSpace

BOOL GetDiskFreeSpaceA([in]  LPCSTR  lpRootPathName,           // 磁盘的根目录[out] LPDWORD lpSectorsPerCluster,      // 每簇扇区数[out] LPDWORD lpBytesPerSector,         // 每扇区字节数[out] LPDWORD lpNumberOfFreeClusters,   // 空闲簇数[out] LPDWORD lpTotalNumberOfClusters   // 总簇数
);

       函数名字似乎只是获取磁盘空闲空间的,但稍加仔细看参数便可知,该函数并未直接返回磁盘容量大小,而是返回簇、扇区的信息。  

        第一个参数为磁盘的根目录,注意,驱动器规范必须具有尾随反斜杠(例如,“C:\”)。

// 计算簇大小(字节)
DWORD clusterSize = lpSectorsPerCluster * lpBytesPerSector;// 计算总空间(字节)
ULARGE_INTEGER totalBytes;
totalBytes.QuadPart = (ULONGLONG)lpTotalNumberOfClusters * lpSectorsPerCluster * lpBytesPerSector;// 计算可用空间(字节)
ULARGE_INTEGER freeBytes;
freeBytes.QuadPart = (ULONGLONG)lpNumberOfFreeClusters * lpSectorsPerCluster * lpBytesPerSector;

       由此,我们可以写一个简单的磁盘分析小工具,运行效果如下:

  

GetDiskFreeSpaceEx

BOOL GetDiskFreeSpaceExW([in, optional]  LPCWSTR         lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,[out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,[out, optional] PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

        这个函数简单明了,名副其实,就是获取磁盘空间大小信息的,注意参数是ULARGE_INTEGER 类型,获取剩余磁盘空间的示例代码如下:

        ULARGE_INTEGER freeBytesAvailable;ULARGE_INTEGER totalNumberOfBytes;ULARGE_INTEGER totalNumberOfFreeBytes;if (GetDiskFreeSpaceExA(path,&freeBytesAvailable,&totalNumberOfBytes,&totalNumberOfFreeBytes)){std::cout << "\nGetDiskFreeSpaceEx Results:\n";std::cout << "Logical Space Information:\n";std::cout << "- Total space: " << (totalNumberOfBytes.QuadPart / (1024.0 * 1024 * 1024)) << " GB\n";std::cout << "- Available space (with quota): " << (freeBytesAvailable.QuadPart / (1024.0 * 1024 * 1024)) << " GB\n";std::cout << "- Total free space (without quota): " << (totalNumberOfFreeBytes.QuadPart / (1024.0 * 1024 * 1024)) << " GB\n";}else {PrintError("GetDiskFreeSpaceEx");}

       

提示💡 

       另外还有个 SHGetDiskFreeSpace 函数,它是 SHGetDiskFreeSpaceEx的别名。内部实现是对 GetDiskFreeSpaceEx 函数的包装, 如果 GetDiskFreeSpaceEx 不可用,则通过调用 GetDiskFreeSpace 函数并操作返回值来模拟它。 

GetDiskSpaceInformation

HRESULT GetDiskSpaceInformationA(LPCSTR                 rootPath,DISK_SPACE_INFORMATION *diskSpaceInfo
);

         这个函数名字一看就不简单了,获取的信息会更丰富些。事实的确如此, 第二个参数 DISK_SPACE_INFORMATION 结构包含了丰富而详细的磁盘空间信息

typedef struct _DISK_SPACE_INFORMATION {ULONGLONG ActualTotalAllocationUnits;           // 实际总分配单元数ULONGLONG ActualAvailableAllocationUnits;       // 实际可用分配单元数ULONGLONG ActualPoolUnavailableAllocationUnits; // 池中不可用的分配单元数ULONGLONG CallerTotalAllocationUnits;           // 调用者可见的总分配单元数ULONGLONG CallerAvailableAllocationUnits;       // 调用者可见的可用分配单元数ULONGLONG CallerPoolUnavailableAllocationUnits; // 调用者可见的池中不可用分配单元数ULONGLONG UsedAllocationUnits;                  // 已使用的分配单元数ULONGLONG TotalReservedAllocationUnits;         // 总保留分配单元数ULONGLONG VolumeStorageReserveAllocationUnits;  // 卷存储保留分配单元数ULONGLONG AvailableCommittedAllocationUnits;    // 可用已提交分配单元数ULONGLONG PoolAvailableAllocationUnits;         // 池中可用分配单元数DWORD     SectorsPerAllocationUnit;             // 每个分配单元的扇区数DWORD     BytesPerSector;                       // 每扇区字节数
} DISK_SPACE_INFORMATION;
    DISK_SPACE_INFORMATION spaceInfo;if (SUCCEEDED(GetDiskSpaceInformation(path, &spaceInfo))) {std::wcout << L"Using GetDiskSpaceInformation:\n";std::wcout << L"Total bytes: " << spaceInfo.TotalNumberOfBytes << L"\n";std::wcout << L"Free bytes: " << spaceInfo.ActualFreeBytesAvailable << L"\n";std::wcout << L"Is quota supported: " << (spaceInfo.QuotaInformation.QuotaSupported ? L"Yes" : L"No") << L"\n";}

        特别需要注意,该函数在 Windows 10 17763 或更高版本上才有效。

        另外,第一个参数和 GetDiskFreeSpace 一样,为磁盘的根目录,驱动器规范必须具有尾随反斜杠(例如,“C:\”)。

        

总结

     

        对于获取磁盘总大小、剩余空间这样简单的需求,GetDiskFreeSpaceEx 最为适合。如果只为Win10及之后的系统开发程序,且需要获取更为详尽的磁盘信息,则使用 GetDiskSpaceInformation。而GetDiskFreeSpace 更为通用,可以在Win 10 17763 之前的版本上正常工作。

        以上三个API的示例分别分为三个工程,代码打包在这里下载👇

        如果你对这方面信息感兴趣,我将在后续文章中进一步分享获取磁盘信息技术,欢迎评论留言交流。


参考 

GetDiskFreeSpaceA 函数 (fileapi.h) - Win32 apps | Microsoft Learn

GetDiskFreeSpaceExA 函数 (fileapi.h) - Win32 apps | Microsoft Learn

SHGetDiskFreeSpaceExW 函数 (shellapi.h) - Win32 apps | Microsoft Learn

getDiskFreeSpaceA 函数 (fileapi.h) - Win32 apps | Microsoft Learn

getDiskFreeSpaceExA 函数 (fileapi.h) - Win32 apps | Microsoft Learn

Hard Disk Drive Basics - NTFS.com

关键字:上海公司牌照最新价格_移动端设计规范_国际新闻最新消息今天_济南做网站比较好的公司

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: