gpt4 book ai didi

windows - 对于 FOR 循环中的目录, “%~zI” 究竟扩展到了什么?

转载 作者:可可西里 更新时间:2023-11-01 13:31:04 24 4
gpt4 key购买 nike

来自 FOR /? :

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file
%~$PATH:I - searches the directories listed in the PATH
environment variable and expands %I to the
fully qualified name of the first one found.
If the environment variable name is not
defined or the file is not found by the
search, then this modifier expands to the
empty string

我已经运行了一个执行 @echo %~aI %~fI ^<%~zI byte^(s^)^> 的 Windows 批处理脚本在FOR循环遍历目录(每个目录的路径都存储在 %I 中)并得到以下输出:

d--hs------ J:\$RECYCLE.BIN  <0 byte(s)>
d---------- J:\Multimedia <4096 byte(s)>
dr--------- J:\-C-\……\Desktop <12288 byte(s)>
dr--------- J:\-C-\……\Documents <28672 byte(s)>
dr--------- J:\-C-\……\Downloads <81920 byte(s)>

上述目录的“大小”与其中文件的大小无关。 %~zI 中的“尺寸”到底是什么意思? ?是 %I一个普通文件,它将是它的大小。但是如果%I怎么办?是一个目录?我不太明白。真的没有意义吗?

最佳答案

这是目录条目

消耗的空间

目录实际上是一个包含其他文件和目录的特殊文件,因此它必须将该列表与必要的元数据一起存储在某个地方。一些文件系统会分配正常的簇并将元数据存储在该数据区域

NTFS 将对大文件夹执行相同的操作。然而在 NTFS 中小文件也可以 stay resident in the MFT entry ,这就是为什么您可以看到一些零字节文件夹的原因,因为它们不需要为目录元数据单独分配 block

包含这些元数据的流的名称是 $I30

In the case of directories, there is no default data stream, but there is a default directory stream. Directories are the stream type $INDEX_ALLOCATION. The default stream name for the type $INDEX_ALLOCATION (a directory stream) is $I30

5.1 NTFS Streams

您可以使用 fsutil file layout <directory_path> 进行检查并查看 $I30溪流。例如,这里是我的 PC 的输出。注意 %~zI 中的相同尺寸和 fsutil输出。大小为 0 的文件夹只包含一个很小的 ​​$INDEX_ROOT流,而其他人有另一个 $INDEX_ALLOCATION%~zI 的输出大小相同

PS C:\> cmd /c "for /d %I in (*) do @echo %~aI %~fI  ^<%~zI byte^(s^)^>"
d---------- C:\ESD <0 byte(s)>
d---------- C:\Intel <0 byte(s)>
d---------- C:\PerfLogs <0 byte(s)>
dr--------- C:\Program Files <8192 byte(s)>
dr--------- C:\Program Files (x86) <4096 byte(s)>
dr--------- C:\Users <4096 byte(s)>
d---------- C:\Windows <16384 byte(s)>
d---------- C:\Windows.old <4096 byte(s)>

PS C:\> foreach ($f in ls -Attr Directory) {
>> $fileLayout = (fsutil file layout $f) -join "`0"
>> $result = (([regex]'\$I30.*?(?=Stream|$)').Matches($fileLayout)) -split "`0" | Select-String -Pattern '\$I30| Size'
>> echo "================================ $f"; $result
>> }
================================ ESD

$I30:$INDEX_ROOT
Size : 48
================================ Intel
$I30:$INDEX_ROOT
Size : 368
================================ PerfLogs
$I30:$INDEX_ROOT
Size : 48
================================ Program Files
$I30:$INDEX_ROOT
Size : 168
$I30:$INDEX_ALLOCATION
Size : 8,192
$I30:$BITMAP
Size : 8
================================ Program Files (x86)
$I30:$INDEX_ROOT
Size : 56
$I30:$INDEX_ALLOCATION
Size : 4,096
$I30:$BITMAP
Size : 8
================================ Users
$I30:$INDEX_ROOT
Size : 56
$I30:$INDEX_ALLOCATION
Size : 4,096
$I30:$BITMAP
Size : 8
================================ Windows
$I30:$INDEX_ROOT
Size : 432
$I30:$INDEX_ALLOCATION
Size : 16,384
$I30:$BITMAP
Size : 8
================================ Windows.old
$I30:$INDEX_ROOT
Size : 56
$I30:$INDEX_ALLOCATION
Size : 4,096
$I30:$BITMAP
Size : 8

ls -l 显示的大小时,同样的事情发生在 *nix 上不是目录内文件的总大小:

在 C++17 中有 std::filesystem::directory_entry 获取目录信息

关于windows - 对于 FOR 循环中的目录, “%~zI” 究竟扩展到了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53094870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com