目前我们使用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上找到文件系统卷信息的正确编程方式吗?
如果不是,那么做同样的方法是什么?
答案 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;
}