C++ 使用statfs获取MacOs上的块文件大小
我想知道MacOs下的块文件大小。在我的示例中,我尝试确定/dev/disk0: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
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;