是否存在无需解压缩重压缩即可复制NTFS压缩文件的Windows API?
NTFS压缩技术具备透明性,读写操作时会自动处理压缩和解压缩流程。但这一特性在复制压缩文件时会带来明显的性能损耗:复制过程中,文件会先在读取阶段被解压缩,随后在写入阶段重新压缩——哪怕目标文件夹未开启“自动压缩新文件”也是如此;如果目标文件夹开启了该选项,写入阶段还会额外多执行一次压缩操作。
我推测(尚未测试):尽管复制时经历了解压再重压缩的步骤,最终存储的压缩数据和原文件一致,但中间冗余的解压、压缩步骤会显著拖慢复制速度。
用简化模型说明:假设原始文件数据为D,NTFS压缩后的数据为C,源文件处于NTFS压缩状态,底层存储的是C。当前复制流程是C -> D -> C:先把压缩数据C解压到内存变为D(可能按块处理而非整文件),再重新压缩为C写入磁盘。如果能跳过中间步骤,直接走C -> C的流程,也就是直接复制底层压缩字节,复制效率会大幅提升。
现有API的局限
现有的LZCopy函数无法实现这种直接复制,它的行为是:
将源文件复制到目标文件。若源文件经Lempel-Ziv算法压缩,此函数会创建解压缩的目标文件;若源文件未压缩,则复制原文件。
核心疑问
是否存在无需解压缩重压缩、可直接复制NTFS压缩文件底层压缩数据的Windows API?目前是否尚无此类API?
更新内容
1. 当前发现
根据OSR社区的讨论,可通过已文档化的Defrag API、FSCTL和/或DeviceIoControl读取压缩数据,但未提及关键的第二部分:如何将压缩数据写入文件,并告知系统该数据已处于压缩状态,避免再次执行压缩操作。
2. 需求背景
近期我在旧硬盘间复制文件时发现,目标磁盘开启NTFS压缩时,复制速度差异明显。由于几乎所有源文件都是NTFS压缩状态,我想到如果有API能直接复制底层压缩数据,而非先解压再重压缩,效率会大幅提升。这更多是出于好奇,目前我已临时关闭目标文件夹的“压缩添加到此文件夹的新文件”选项,待复制完成后再对目标磁盘数据进行统一压缩。
内容的提问来源于stack exchange,提问作者Limina102

