我需要在我的 C++ 应用程序中检查拇指驱动器上的文件系统类型。必须在安装新分区之前完成此操作。我也不想调用system()
函数。我尝试使用以下测试代码:
#include <blkid/blkid.h>
#include <stdio.h>
int main()
{
blkid_probe pr;
const char *ptname;
const char* devname = "/dev/sdb1";
pr = blkid_new_probe_from_filename(devname);
if (!pr)
printf("faild to open device\n");
else
{
blkid_probe_enable_partitions(pr, true);
blkid_do_fullprobe(pr);
blkid_probe_lookup_value(pr, "PTTYPE", &ptname, NULL);
printf("%s partition type detected\n", ptname);
blkid_free_probe(pr);
}
}
当我用这段代码插入拇指驱动器时,ntfs
显示我的分区是dos。当我插入拇指驱动器时fat
,或ext4
代码返回奇怪的字符串,但对于这两个文件系统来说是相同的:
AWAVI��AUATL�%�
.
是什么导致了这些奇怪的输出?也许有更好的方法来检查文件系统?预先感谢您的任何帮助。
答案1
如果您对哪个文件系统感兴趣,sdb1
您应该USAGE
首先检查它是否是 a filesystem
,然后使用 获取文件系统类型TYPE
。
您需要设置这些标志才能启用文件系统查找:
blkid_probe_set_superblocks_flags(probe, BLKID_SUBLKS_USAGE | BLKID_SUBLKS_TYPE |
BLKID_SUBLKS_MAGIC | BLKID_SUBLKS_BADCSUM);
关于你的结果:你需要检查blkid_probe_lookup_value
(或blkid_probe_has_value
首先使用)的返回值,你没有初始化ptname
,NULL
所以如果查找失败你会得到垃圾。并且查找将会失败,因为分区没有PTTYPE
. (我不确定为什么它对 NTFS 有效,在我的例子中 NTFS 和 ext4 分区都没有PTTYPE
。)
具有用法和类型的版本可能如下所示
#include <blkid/blkid.h>
#include <stdio.h>
#include <string.h>
int main()
{
blkid_probe pr;
const char *value = NULL;
const char* devname = "/dev/sdb1";
int ret = 0;
pr = blkid_new_probe_from_filename(devname);
if (!pr)
printf("faild to open device\n");
else
{
blkid_probe_enable_partitions(pr, 1);
blkid_probe_set_superblocks_flags(pr, BLKID_SUBLKS_USAGE | BLKID_SUBLKS_TYPE |
BLKID_SUBLKS_MAGIC | BLKID_SUBLKS_BADCSUM);
blkid_do_fullprobe(pr);
ret = blkid_probe_lookup_value(pr, "USAGE", &value, NULL);
if (ret != 0) {
printf("lookup failed\n");
return 1;
} else
printf("usage: %s\n", value);
if (strcmp(value, "filesystem") != 0) {
printf("not filesystem\n");
return 1;
}
ret = blkid_probe_lookup_value(pr, "TYPE", &value, NULL);
if (ret != 0) {
printf("lookup failed\n");
return 1;
} else
printf("type: %s\n", value);
blkid_free_probe(pr);
}
}