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

どのファイルシステムかを知りたい場合は、まずそのファイルシステムがaであることを確認してから、次を使用してファイルシステムの種類を調べる必要がありますsdb1USAGEfilesystemTYPE

ファイルシステム検索を有効にするには、次のフラグを設定する必要があります。

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_valueptnameNULLPTTYPEPTTYPE

使用法と種類を含むバージョンは次のとおりです。

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

おすすめ記事