blkid: blkid_probe_lookup_value() - 奇怪的分区类型

blkid: blkid_probe_lookup_value() - 奇怪的分区类型

我需要在我的 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首先使用)的返回值,你没有初始化ptnameNULL所以如果查找失败你会得到垃圾。并且查找将会失败,因为分区没有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);
    }
}

相关内容