如何减小 NTFS 中文件夹索引文件的大小?

问题描述 投票:0回答:4

我有一个 NTFS 文件夹,其中包含数万个文件。我已删除该文件夹中的所有文件,保存 1。我运行 contig.exe 对该文件夹进行碎片整理,因此现在它仅包含 1 个片段。然而,该文件夹的大小仍然是 8MB。这意味着该指数存在很大差距。这是为什么?如果我删除该文件,索引的大小会自动变为零。我的猜测是因为它被折叠到 MFT 中。有没有办法让NTFS真正对索引文件进行碎片整理,根据文件内容进行碎片整理?您知道任何 API 吗? Contig.exe 仅对物理文件进行碎片整理。

ntfs
4个回答
6
投票

我想这是 NTFS 与几乎所有其他 FS 一样的一种方式 - 它们似乎都不喜欢缩小目录。

所以你应该采用一种高科技方法,其中涉及使用高级语言“BAT”:)

崩溃.bat

REM Invoke as "collapse dirname"
ren dirname dirname.old
mkdir dirname
cd dirname.old
move * ../dirname/
cd ..
rmdir dirname.old

2
投票

指数中有松弛,但没有缺口。 我做出这样的区分是为了暗示技术上存在空间浪费,但 NTFS 并不需要解析 8MB 才能枚举/查询/任何索引。 它知道其树的根在哪里,并且它恰好有很多额外的分配剩余。 考虑到它的无益,可能是太详细的回复。

碎片化可能完全是一个单独的问题。


2
投票

看看这个问题的公认答案:NTFS 性能和大量文件和目录

作者提供了一些有关文件索引碎片的未记录信息,这些信息是他在一次事件期间从 Microsoft 技术支持处收到的。简而言之,DEFRAG 不会对文件夹索引进行碎片整理,只会对该文件夹中的文件进行碎片整理。如果要对文件索引进行碎片整理,则必须使用 SysInternals 的 CONTIG 工具,该工具现在由 Microsoft 拥有和分发(免费)。答案给出了CONTIG的链接。


0
投票

已接受答案的想法很好且功能齐全,但响应中给出的 .bat 文件代码示例不起作用。

实际工作的代码应该如下所示:

修复了崩溃.bat

REM Invoke as "collapse dirname"
set dirname=%1
ren %dirname% %dirname%.old
mkdir %dirname%
cd %dirname%.old
move * ../%dirname%/
cd ..
rmdir %dirname%.old

与 Windows 批处理/CMD 文件一样,您需要首先将命令行参数分配给变量。要使用存储在任何变量中的实际值(而不仅仅是变量名称),变量名称必须用 % 字符括起来(和/或感叹号 - 如果启用了 DelayedExpansion)。

© www.soinside.com 2019 - 2024. All rights reserved.