GetCompressedFileSize返回的是NTFS压缩后磁盘占用字节数非压缩比例须先用GetFileAttributes检查FILE_ATTRIBUTE_COMPRESSED标志否则结果无意义且对非NTFS卷、加密或稀疏文件行为未定义。GetCompressedFileSize 返回值比实际大先确认文件是否真被压缩这个函数不返回“压缩比例”它只返回 NTFS 压缩后文件在磁盘上占用的字节数即“压缩后的逻辑大小”和 GetFileSize 返回的原始大小对比才能算出比例。但很多人直接拿 GetCompressedFileSize 结果当“压缩后体积”结果发现比原始大小还大——那说明文件根本没被 NTFS 压缩或者压缩失败了。必须先用 GetFileAttributes 检查 FILE_ATTRIBUTE_COMPRESSED 标志是否置位否则 GetCompressedFileSize 的返回值无意义该函数对非 NTFS 卷如 FAT32、exFAT、网络共享总是返回原始大小不报错也不提示对加密文件FILE_ATTRIBUTE_ENCRYPTED或稀疏文件行为未定义建议跳过GetCompressedFileSize 在 Windows 10/11 上返回错误检查调用方式常见错误是传入了无效句柄或忽略错误码。它不抛异常只靠返回值和 GetLastError() 判断成败。必须用 CreateFile 以 GENERIC_READ 权限打开且不能带 FILE_FLAG_NO_BUFFERING否则返回 0 ERROR_INVALID_PARAMETER返回值为 INVALID_FILE_SIZE即 0xFFFFFFFF时立刻调 GetLastError()常见是 ERROR_ACCESS_DENIED权限不足、ERROR_SHARING_VIOLATION文件被独占打开64 位程序注意函数原型返回 DWORD但实际高位可能存于 lpFileSizeHigh 输出参数必须用双参数重载版本 GetCompressedFileSizeExWindows 8或自己拼 LARGE_INTEGER怎么算出真正的压缩比例别直接除比例不是简单用 GetCompressedFileSize 除以原始大小。NTFS 压缩按簇cluster对齐小文件即使压缩后只剩几十字节也可能占满一个簇比如 4KB导致比例失真。原始大小用 GetFileSizeEx 获取 LARGE_INTEGER避免 32 位截断压缩后大小也必须用 GetCompressedFileSizeEx推荐或正确处理高低 32 位若原始大小为 0比例无定义若压缩后大小 ≥ 原始大小说明未压缩或压缩膨胀如已加密/高熵数据此时比例应视为 1.0示例计算逻辑double ratio (double)compressedSize / (double)originalSize;if (compressedSize originalSize || originalSize 0) ratio 1.0;替代方案为什么有时 GetCompressedFileSize 不够用它只反映 NTFS 文件系统级压缩对 ZIP、7z 等应用层压缩包完全无效——你拿到的只是 ZIP 文件自身的大小不是里面内容的压缩率。 WisPaper 复旦大学研发的AI学术搜索工具5分钟内筛选1000篇论文