Cygwin中的stat()和块大小

时间:2018-05-01 10:19:05

标签: filesystems cygwin stat

我希望代码类似于du的功能。我通过使用stat()函数尝试了这个。我从st_blocks报告的stat()是在磁盘中分配的实际块编号。块大小应为512字节,st_blocks*512应为文件的分配字节数。但是我发现Cygwin环境令人困惑。首先,我使用dd命令创建一个8KB的文件。

% dd if=/dev/urandom bs=4096 count=2 of=testfile
2+0 records in
2+0 records out
8192 bytes (8.2 kB, 8.0 KiB) copied, 0.00791222 s, 1.0 MB/s

然后我使用文件

运行stat命令
% stat testfile
  File: testfile
  Size: 8192            Blocks: 8          IO Block: 65536  regular file
Device: 7727c30h/124943408d     Inode: 25614222880771065  Links: 1
Access: (0664/-rw-rw-r--)  Uid: (197881/ crystal)   Gid: (  513/    None)
Access: 2018-05-01 15:11:50.760626400 +0800
Modify: 2018-05-01 15:11:50.761626500 +0800
Change: 2018-05-01 15:11:50.761626500 +0800
 Birth: 2018-05-01 15:11:50.760626400 +0800

我不认为有一个“洞”'在生成的文件上。我得到分配了8个块的文件,这意味着块大小为1KiB而不是512B。如果我使用stat()调用执行C代码,st_blocks会得到相同的结果。

到目前为止,所有文章都说块大小为512B。有例外吗?如果是,我如何获得实际的块大小?或者,如何获取文件占用的实际磁盘空间?

1 个答案:

答案 0 :(得分:0)

stat命令行工具具有%B格式选项,该选项显示正在使用的块大小。似乎stat在Cygwin中使用了1024字节的块。

此外,看起来NTFS 4096字节的块大小实际上是在幕后使用的,而stat只是呈现1024字节的块:

$ dd if=/dev/urandom of=foo count=1 bs=4095
$ stat -c '%B %b' foo
1024 4
$ dd if=/dev/urandom of=foo count=1 bs=4097
$ stat -c '%B %b' foo
1024 8

讨论了https://unix.stackexchange.com/questions/28780/file-block-size-difference-between-stat-and-ls中512字节和1024字节块大小的来源。显然它与Linux内核约定和GNU实用程序约定有关。