GLIB系列文章目录 - GFile, GKeyFile, GMappedFile 文件类型

1 篇文章 0 订阅

系列文章目录



前言

一、GFile

GFile 是 GLib 库中的一个类,用于表示文件的路径或 URI。GFile 本身并没有提供直接获取文件名的方法,但你可以通过 GFile 的 get_path() 方法获取文件的完整路径,然后从中提取出文件名。

以下是一个简单的示例代码,展示了如何使用 GFile 获取文件名:

#include <glib.h>

int main(int argc, char **argv) {
    GFile *file;
    GError *error = NULL;
    gchar *filename;

    // 创建 GFile 对象
    file = g_file_new_for_path(argv[1]);
    
	// 文件路径
    const gchar *file_path = "/path/to/your/file.txt";

    // 创建 GFile 对象
    GFile *file = g_file_new_for_path(file_path);

    // Get the full path of the file
    gchar *path = g_file_get_path(file);
    if (path == NULL) {
        g_print("Error getting file path: %s\n", error->message);
        return 1;
    }

    // Extract the filename from the full path
    filename = g_path_get_basename(path);

    // Do something with the filename...

    // Clean up
    g_free(path);
    g_object_unref(file);
    g_free(filename);

    return 0;
}

在这个例子中,argv[1] 是文件名,它被传递给 g_file_new_for_path() 函数以创建一个新的 GFile 对象。然后,g_file_get_path() 函数用于获取文件的完整路径,g_path_get_basename() 函数用于从完整路径中提取文件名。

请注意,这只是一个基本的示例,你可能需要根据你的具体需求进行修改或调整。

一、GKeyFile

GKeyFile 是 GLib 库中的一个类,主要用于处理类似于 .ini 文件的键值对配置文件(如desktop文件,.conf 文件,flatpak repo/config, metadata, kaimingrepo文件, 二进制键值对文件repo/tmp/cache/summaries/kaiming-repo-x86_64-commit.sub等)。然而,GKeyFile 本身并没有提供直接获取文件名的方法。

如果你想要获取 GKeyFile 对象关联的文件名,你可以通过检查 GKeyFile 的构造函数参数来获取。例如,如果你使用了 g_key_file_new() 函数创建了一个新的 GKeyFile 对象,那么这个对象就没有关联的文件名。如果你使用了 g_key_file_load_from_file() 函数加载一个文件,那么这个函数的第一个参数就是你想要的文件名。

构造一个简单的文件:

[STARTUP]
x=300
y=600
center=true


[PATH]
bin_path=/bin;/sbin;/usr/bin;/usr/local/bin;

以下是一个简单的示例代码,展示了如何使用 GKeyFile 加载一个文件并获取其文件名:


// 编译方式: gcc `pkg-config --cflags --libs glib-2.0 main.c
#include <glib.h>

#define STARTUP "STARTUP"
#define PATH    "PATH"

int main(int argc, char **argv) {
    GKeyFile *config; 
    gchar *filename;

    // Load a configuration file
    config = g_key_file_new(); // g_key_file_new()建立一个GKeyFile缓冲区
    g_key_file_load_from_file(config, argv[1], G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, NULL); // 初始化填充这个缓冲区
	
	// g_key_file_get_数据类型()来获取数据
	gchar* x = g_key_file_get_value(config,STARTUP,"x",NULL);
    g_print("x = %s\n",x);

    gchar* y = g_key_file_get_string(config,STARTUP,"y",NULL);
    g_print("y = %s\n",y);

    gboolean center = g_key_file_get_boolean(config,STARTUP,"center",NULL);
    g_print("center = %d\n",center);

    // Get the filename associated with the configuration file
    filename = g_strdup(argv[1]);

	gsize length,i;
    gchar** bin_path = g_key_file_get_string_list(config,PATH,"bin_path",&length,NULL);

    g_print("bin_path=");
    for(i = 0; i < length;i++){
        g_print("%s;",bin_path[i]);
    }
    g_print("\n");

    // Do something with the configuration file or its contents...

    // Clean up
    g_key_file_free(config);
    g_free(filename);

    return 0;
}

其他实例:

bool getRefsList(Ref &ref, char *metadata)
    {
        GBytes *metadata_bytes = NULL;
        metadata_bytes = g_bytes_new(metadata, strlen(metadata));
        
		const char *options_data;
        gsize options_size;
        options_data = g_bytes_get_data (metadata_bytes, &options_size); // 从字节流GBytes 获取 char* 字符串
        
        g_autoptr(GKeyFile) keyfile = g_key_file_new ();
        g_autoptr(GError) local_error = NULL;
         if (!g_key_file_load_from_data (keyfile, options_data, options_size, 0, &local_error))
        {
          g_debug (error, _("Can't load uri %s: %s\n"), filename, local_error->message);
          return NULL;
        }
        

        g_debug("get resolved_metadata, resolved_metakey from metadata ");
        GKeyFile *metakey = g_key_file_new();
        if (!g_key_file_load_from_bytes(metakey, metadata_bytes, G_KEY_FILE_NONE, NULL))
        {
            g_debug("get resolved_metadata, resolved_metakey from metadata ");
            return false;
        }
        ref.resolved_metadata = g_bytes_ref(metadata_bytes);
        ref.resolved_metakey = g_steal_pointer(&metakey);

        //  (const char *)g_bytes_get_data (metadata_bytes)
        char *runtime_pref = NULL;
        runtime_pref = g_key_file_get_string(ref.resolved_metakey, "Application", "runtime", NULL);
        g_debug("%s is app, from group [Application] to find runtime: %s", ref.completedId.c_str(), runtime_pref);
        }
        

在这个例子中,argv[1] 是文件名,它被传递给 g_key_file_load_from_file() 函数以加载文件,然后又被复制到 filename 变量中以便稍后使用。

请注意,这只是一个基本的示例,你可能需要根据你的具体需求进行修改或调整。

二、GMappedFile

GMappedFile 是 GLib 库中的一个类,用于在内存中映射文件,从而可以像访问数组一样访问文件的内容。但是,GMappedFile 本身并没有提供直接获取文件名的方法。

如果你想获取 GMappedFile 对象关联的文件名,你可以通过检查 GMappedFile 的构造函数参数来获取。例如,如果你使用了 g_mapped_file_new() 函数创建一个新的 GMappedFile 对象,那么这个对象就没有关联的文件名。如果你使用了 g_mapped_file_new_from_file() 函数加载一个文件,那么这个函数的第一个参数就是你想要的文件名。

以下是一个简单的示例代码,展示了如何使用 GMappedFile 加载一个文件并获取其文件名:

/**
     * @brief 根据文件名获取subsummary
     *
     * @param summaryFilePath
     * @return GVariant*
     */
    GVariant *getSummary(string summaryFilePath)
    {
        char *path = (char *)summaryFilePath.c_str();

        GMappedFile *mfile = NULL;
        GBytes *mfile_bytes = NULL;
        char *sha256 = NULL;

        GFile *subCacheFile = g_file_new_for_path(path);
        g_autofree char *path = g_file_get_path (sig_cache_file); // 获取GFile 路径
        mfile = g_mapped_file_new(getFilePathCached(subCacheFile), FALSE, NULL);
        if (mfile == NULL)
        {
            kmlogger.error("Failed to create mapped file!");
            return NULL;
        }
        mfile_bytes = g_mapped_file_get_bytes(mfile);
        sha256 = g_compute_checksum_for_bytes(G_CHECKSUM_SHA256, mfile_bytes); // index: 5d8e4966ad282f50f138671397263ccee6866c4666b9f6c172e7609f3462a533

        g_debug("file sha256:  %s", sha256);

        VarRefInfoRef info;
        GVariant *summary = NULL;

        // g_hash_table_insert (progressStatus.subsummaries, g_strdup (arch), subsummary);
        summary = g_variant_ref_sink(g_variant_new_from_bytes(OSTREE_SUMMARY_GVARIANT_FORMAT, mfile_bytes, FALSE));

        return summary;
    }

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yusq77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值