You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

与POSIX pathconf() _PC_MIN_HOLE_SIZE等价的Win32 API及查询方法

POSIX pathconf(_PC_MIN_HOLE_SIZE)对应的Win32实现方案

POSIX标准中pathconf(_PC_MIN_HOLE_SIZE)用于查询文件系统支持的稀疏文件最小空洞大小,Windows没有直接等价的API,但可通过获取文件系统的簇大小来得到对应值——因为NTFS、ReFS等支持稀疏文件的Windows文件系统中,空洞是以簇为单位进行标记的,小于簇大小的空间无法被识别为空洞。

获取步骤

  • 打开目标路径的文件或目录句柄(需GENERIC_READ权限,目录需加上FILE_FLAG_BACKUP_SEMANTICS标志)。
  • 通过GetFileInformationByHandleEx函数,请求FileFsSizeInformation类型的信息,其中BytesPerCluster字段即为该文件系统的簇大小,也就是稀疏文件的最小空洞大小。
  • 也可使用GetDiskFreeSpace函数,传入目标路径的根目录,计算每簇扇区数与每扇区字节数的乘积得到簇大小。

示例代码

#include <windows.h>
#include <wchar.h>

DWORD GetMinimumHoleSize(LPCWSTR targetPath) {
    // 打开目标路径的句柄,目录需FILE_FLAG_BACKUP_SEMANTICS
    HANDLE hHandle = CreateFileW(
        targetPath,
        GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS,
        NULL
    );

    if (hHandle == INVALID_HANDLE_VALUE) {
        return 0;
    }

    FILE_FS_SIZE_INFO fsInfo;
    DWORD bytesRead;
    BOOL result = GetFileInformationByHandleEx(
        hHandle,
        FileFsSizeInformation,
        &fsInfo,
        sizeof(fsInfo),
        &bytesRead
    );

    CloseHandle(hHandle);
    return result ? fsInfo.BytesPerCluster : 0;
}

int main() {
    DWORD minHoleSize = GetMinimumHoleSize(L"C:\\example");
    if (minHoleSize > 0) {
        wprintf(L"Minimum sparse file hole size: %lu bytes\n", minHoleSize);
    } else {
        wprintf(L"Failed to retrieve hole size (error: %lu)\n", GetLastError());
    }
    return 0;
}

注意:仅NTFS、ReFS等支持稀疏文件的文件系统有此概念,FAT32等不支持稀疏文件的文件系统,该值无实际意义。

内容的提问来源于stack exchange,提问作者Cedric Blancher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:22:16