我有 20 个文件,其中数据结构在 NTFS 中与 4k 扇区对齐。我想合并所有文件无需复制任何数据。
目标是编写一种通过直接更改 NTFS 虚拟集群和物理集群来工作的插入 API。
目标是从 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 个文件的所有逻辑扇区更改为已删除的文件扇区,然后使用特定的已存在扇区创建一个文件。
一个可行的解决方案将产生以下结果:
来源 1:VCN:0 集群:16 LCN:54723798
来源 2:VCN:0 集群:16 LCN:6172145
Target:
扩展2:
VCN:0 集群:16 LCN:54723798
VCN:16 集群:16 LCN:6172145
要验证更改,您可以以管理员身份运行 cmd windows:
fsutil 卷文件布局“C:\Data\BigFile.txt”
欢迎任何其他想法或一些 C++/C 代码来更改或插入 MFT 条目。
更新 1:我可以读取 NTFS 分区的 MFT,但我确实需要知道如何创建或编辑文件条目的人。也欢迎其他解决方案