我有20个文件,其中数据结构在NTFS中与4k扇区对齐。我希望将所有文件合并而不复制任何数据。 目标是编写一种插入API,通过直接更改NTFS虚拟群集和物理群集来工作。
目标是从50GB块中获取大小为1TB的文件而不进行复制。所有数据都已存在于磁盘上且位于同一卷上。 这可以通过直接在文件中设置NTFS逻辑集群来实现。
我可以使用 FSCTL_GET_RETRIEVAL_POINTERS
读取文件的虚拟到物理翻译资料来源:VCN:0集群:16 LCN:54723798
目标:VCN:0集群:160 LCN:6172145
我尝试使用Windows Defrag API:
bool fResult = DeviceIoControl(
hVol,
FSCTL_MOVE_FILE,
p,
bufSize,
NULL,
0,
ref size,
NULL);
虽然这是完美的命令,但它无法将源文件的物理地址更改为目标文件的物理地址: 的 STATUS_ACCESS_DENIED 即可。如果我删除目标文件,我可以移动物理群集,但目标文件已经消失。
NTFS硬链接会很好但我无法创建另一个文件的子部分的硬链接。
我在Windows机器上拥有管理员权限,我需要在文件系统级别上执行此操作,而不是使用Windows文件API,以避免任何复制。解决方案是通过直接写入NTFS主文件表来更改集群。
或者删除大文件,将20个文件的所有逻辑扇区更改为已删除的文件扇区,然后创建具有特定已存在扇区的文件。
工作解决方案会产生结果:
Source1:VCN:0 Cluster:16 LCN:54723798
Source2:VCN:0 Cluster:16 LCN:6172145
目标:
扩展2:
VCN:0群集:16 LCN:54723798
VCN:16集群:16 LCN:6172145
要验证更改,您可以以管理员身份运行cmd窗口:
fsutil volume filelayout“C:\ Data \ BigFile.txt”
欢迎更改或插入MFT条目的任何其他想法或某些C ++ / C代码。
更新1:我可以读取NTFS分区的MFT,但我真的需要知道如何创建或编辑文件条目的人。其他解决方案也欢迎