首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >macOS :确定卷信息的正确编程方法

macOS :确定卷信息的正确编程方法
EN

Stack Overflow用户
提问于 2017-09-21 13:28:45
回答 1查看 1.4K关注 0票数 6

目前,我们使用stafs来确定有关我们所使用的文件系统卷的信息。

代码语言:javascript
复制
#include <string>  
#include <iostream>  
#include <sys/mount.h>  
#include <sys/param.h>  

void statFileSys(const std::string f)  
{  
    struct statfs fileStat;  
    if(statfs(f.data(),&fileStat) == 0)  
    {  
        std::cout << "File type: " << fileStat.f_type <<'\n';  
        std::cout << "File system name: "<<fileStat.f_fstypename << '\n';  
    }  
    else  
    {  
        std::cout << "statfs failed !!!"<<std::endl;  
    }  
}  

int main()  
{  
    statFileSys("/some/network/path");  
    statFileSys("/tmp");  

    return 0;  
}  

我们依靠

代码语言:javascript
复制
f_type  

值,以便根据其HFS+或APFS或网络文件系统进行决策。

但是,我们看到在三种不同的macOS系统上为上述小型独立可复制代码提供了奇怪的输出。

代码语言:javascript
复制
1]
macOS 10.12 + HFS+
File type: 25
File system name: autofs
File type: 23
File system name: hfs

2]
macOS 10.13 (beta) + HFS+
File type: 24
File system name: autofs
File type: 23
File system name: hfs

3]
macOS 10.13 (beta) + APFS
File type: 25
File system name: autofs
File type: 24
File system name: apfs

对于2],我们得到网络路径(autofs)的f_type值为24,而在3]中,对于APFS,我们得到f_type为24,这似乎不一致。

这就引出了qustion,statfs是否是在macOS上找到文件系统卷信息的正确编程方式?

如果不是这样的话,那么怎样才是正确的方法呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 15:50:54

根据由文件类型 ()返回的vfs_statfs,苹果认为文件系统类型编号是一种过时的机制。虽然这对于statfs()不是确定的,但是vfs_statfs()更好地记录了如下:

文件系统类型编号是一个旧的构造;大多数文件系统只是根据在系统中注册的顺序分配一个编号。

由于在最近版本的MacOS中,现在在运行时分配文件系统类型编号,因此必须使用f_fstypename来确定类型。您将注意到,在AppKit的getFileSystemInfoForPath方法的签名中,文件系统类型也表示为字符串。似乎你将得到的最官方的是苹果自己的API。

代码语言:javascript
复制
#include <string>  
#include <iostream>  
#include <sys/mount.h>  
#include <sys/param.h>  

void statFileSys(const std::string f)  
{  
    struct statfs fileStat;  
    if(statfs(f.data(),&fileStat) == 0)  
    {  
        if(!strcmp(fileStat.f_fstypename, "apfs") )
            std::cout << "File system is APFS << std::endl;
        else if(!strcmp(fileStat.f_fstypename, "hfs") )
            std::cout << "File system is HFS+ << std::endl;
        else if(!strcmp(fileStat.f_fstypename, "nfs") )
            std::cout << "File system is NFS << std::endl;
        else if(!strcmp(fileStat.f_fstypename, "cd9660") )
            std::cout << "File system is CD-ROM << std::endl;
        else
            std::cout << "We weren't looking for a " 
                << fileStat.f_fstypename << " were we?" << std::endl;
    }  
    else  
    {  
        std::cout << "statfs failed !!!"<<std::endl;  
    }  
}  

int main()  
{  
    statFileSys("/some/network/path");  
    statFileSys("/tmp");  

    return 0;  
}  
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46345265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档