macOS:正确的编程方式来确定音量信息

时间:2017-09-21 13:28:46

标签: c++ macos filesystems posix macos-high-sierra

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

display: flex

我们依靠

flex-direction: column

根据其HFS +或APFS或网络文件系统做出决策的值。

然而,我们看到三个不同的macOS系统上出现了奇怪的输出,以获得上述小型独立可重现代码。

#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;  
}  

对于f_type ,我们将网络路径的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 值(autofs)设为24,而在2]中我们得到f_type为24,因为APFS看起来并不一致

这给我们带来了qustion,3]是在macOS上找到文件系统卷信息的正确编程方式吗?

如果不是,那么做同样的方法是什么?

1 个答案:

答案 0 :(得分:7)

根据vfs_statfs()返回的documentation for vfs_filetype,Apple将文件系统类型号视为一种古老的机制。尽管这对于statfs()并不是确定的,但vfs_statfs()的文档更好:

  

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

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

#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::count << "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;  
}