C++ 使用statfs获取MacOs上的块文件大小

C++ 使用statfs获取MacOs上的块文件大小,c++,macos,filesystems,C++,Macos,Filesystems,我想知道MacOs下的块文件大小。在我的示例中,我尝试确定/dev/disk0: diskutil info /dev/disk0 Device Identifier: disk0 Device Node: /dev/disk0 Whole: Yes Part of Whole: disk0 Device / Media Name: APPLE S

我想知道MacOs下的块文件大小。在我的示例中,我尝试确定/dev/disk0:

diskutil info /dev/disk0
   Device Identifier:         disk0
   Device Node:               /dev/disk0
   Whole:                     Yes
   Part of Whole:             disk0
   Device / Media Name:       APPLE SSD SD0128F

   Volume Name:               Not applicable (no file system)
   Mounted:                   Not applicable (no file system)
   File System:               None

   Content (IOContent):       GUID_partition_scheme
   OS Can Be Installed:       No
   Media Type:                Generic
   Protocol:                  PCI
   SMART Status:              Verified

   Disk Size:                 121.3 GB (121332826112 Bytes) (exactly 236978176 512-Byte-Units)
Diskutil提供了正确的大小“123.3 GB”。现在,使用statfs也可以做同样的事情:():

#包括
#包括
#包括
int main()
{
结构statfs;
statfs(“/dev/disk0”和&s);

std::coutstatfs的文件如下所示:

Statfs()返回有关装入的文件系统的信息 装载的文件系统中任何文件的路径名。Buf是指针 到定义如下的statfs或statfs64结构

您正在将
/dev/disk0
作为路径传递,这将为您提供文件系统所代表的
/dev
的大小,这可能是某种devtmpfs。您的路径应该是
/dev/disk0
上保存的文件系统中的文件名或路径,而不是块设备本身

对于任意块设备: 发布IOCTL:

intfd=open(“/dev/whatever”,仅限ordu);
如果(fd<0){
//错误处理
}
uint64_t计数;
if(ioctl(fd、DKIOCGETBLOCKCOUNT和count)<0){
//错误处理
}
uint32_t b尺寸;
if(ioctl(fd、DKIOCGETBLOCKSIZE和bsize)<0){
//错误处理
}
返回计数*b大小;

statfs的文件如下所示:

Statfs()返回有关装入的文件系统的信息 装载的文件系统中任何文件的路径名。Buf是指针 到定义如下的statfs或statfs64结构

您正在将
/dev/disk0
作为路径传递,这将为您提供文件系统所代表的
/dev
的大小,这可能是某种devtmpfs。您的路径应该是
/dev/disk0
上保存的文件系统中的文件名或路径,而不是块设备本身

对于任意块设备: 发布IOCTL:

intfd=open(“/dev/whatever”,仅限ordu);
如果(fd<0){
//错误处理
}
uint64_t计数;
if(ioctl(fd、DKIOCGETBLOCKCOUNT和count)<0){
//错误处理
}
uint32_t b尺寸;
if(ioctl(fd、DKIOCGETBLOCKSIZE和bsize)<0){
//错误处理
}
返回计数*b大小;

确定如何获取该路径?@MateuszWojtczak如果该磁盘代表文件系统根,
/
应该可以工作。@MateuszWojtczak您的问题不清楚。如果您要查找根分区的大小,只需使用文本
“/”
。如果您想获得具有未知装入点的任意块设备的大小,可以使用
getmtent
遍历装入表。如果您想获得任意(不一定是装入的)块设备的大小,则需要发出
BLKGETSIZE64
IOCTL。再次,您将遇到奇怪的尴尬e它可能没有装入,可能装入了一个保留空间的文件系统,等等。
getfsstat
将返回一个
statfs
结构的数组。@nanofard我想得到任意大小的块文件。我在macOs上看不到getmtent,我假设这是linux特定的。macOs的等价物是什么?确定如何获得该路径?@MateuszWojtczak如果这个磁盘代表文件系统根,
/
应该可以工作。@MateuszWojtczak您的问题不清楚。如果您要查找根分区的大小,您只需使用文本
“/”
。如果您想获得具有未知装入点的任意块设备的大小,可以使用
getmtent
遍历装入表。如果您想获得任意(不一定是装入的)块设备的大小,则需要发出
BLKGETSIZE64
IOCTL。再次,您将遇到奇怪的尴尬e它可能没有装入,可能装入了一个保留空间的文件系统,等等。
getfsstat
将返回一个
statfs
结构的数组。@nanofard我想得到任意大小的块文件。我在macOs上没有看到getmtent,我假设这是linux特有的。macOs的等价物是什么?
#include <iostream>

#include <sys/param.h>
#include <sys/mount.h>

int main()
{
        struct statfs s;
        statfs("/dev/disk0", &s);
        std::cout << s.f_bsize * s.f_blocks << " B\n";
}
int fd = open("/dev/whatever", O_RDONLY);
if(fd  < 0) {
    // error handling
}
uint64_t count;
if(ioctl(fd, DKIOCGETBLOCKCOUNT, &count) < 0) {
    // error handling
}
uint32_t bsize;
if(ioctl(fd, DKIOCGETBLOCKSIZE, &bsize) < 0) {
    // error handling
}
return count * bsize;