系列文章目录
前言
一、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;
}