Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78863
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-02 16:15
文章分类
文章存档

2016年(24)

我的朋友

分类: C/C++

2016-04-29 09:04:48

    最近有个案子需要检测系统是否为正常关机,使用读写文件的方式实现,主要使用到了
glib库函数,下面是code片段,其中AP_CONFIG_FILE_PATH定义如下:

#define AP_CONFIG_FILE_PATH "/usr/share/archer/ap_checker.conf"

配置文档“ap_checker.conf”的内容为:

[ap_checker]
power_off_normal=0
ap_ck_reboot_count=0
system_reboot_count=0

具体code:

static int archer_check_power_off_normal(void)
{
    GKeyFile *keyfile;
    GKeyFileFlags flags;
    GError *error = NULL;
    gchar *file_buf = NULL;
    gsize length;

    keyfile = g_key_file_new();
    flags = G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS;
    if(!g_key_file_load_from_file(keyfile, AP_CONFIG_FILE_PATH, flags, &error))
    {
        printf("ERR:Load AP_CONFIG_FILE_PATH error!\n");
        g_key_file_free(keyfile);
    }
    else
    {
        if (g_key_file_get_integer(keyfile, "ap_checker", "power_off_normal", NULL) == POWER_OFF_NORMAL_NO)
        {
            g_key_file_set_integer(keyfile, "ap_checker", "ap_ck_reboot_count", 0);
            g_key_file_set_integer(keyfile, "ap_checker", "system_reboot_count", 0);
        }
        else
        {
            g_key_file_set_integer(keyfile, "ap_checker", "power_off_normal", 0);
        }
        file_buf = g_key_file_to_data(keyfile, &length, &error);
        g_file_set_contents(AP_CONFIG_FILE_PATH, file_buf, -1, &error);
    }
    g_key_file_free(keyfile);

    return 0;
}


库函数说明:

g_key_file_new ()

GKeyFile * g_key_file_new(void);

Creates a new empty GKeyFile object. Use g_key_file_load_from_file(), g_key_file_load_from_data(), g_key_file_load_from_dirs() or g_key_file_load_from_data_dirs() to read an existing key file.

Returns : an empty GKeyFile.

g_key_file_free ()

void g_key_file_free(GKeyFile *key_file);

Frees a GKeyFile.

key_file :  a GKeyFile

g_key_file_load_from_file ()

gboolean g_key_file_load_from_file(GKeyFile *key_file,
                                   const gchar *file,
                                   GKeyFileFlags flags,
                                   GError **error);

Loads a key file into an empty GKeyFile structure. If the file could not be loaded then error is set to either a GFileError or GKeyFileError.

    key_file : an empty GKeyFile struct
    file : the path of a filename to load, in the GLib filename encoding
    flags : flags from GKeyFileFlags
    error : return location for a GError, or NULL

Returns :  TRUE if a key file could be loaded, FALSE otherwise

g_key_file_get_integer ()

gint g_key_file_get_integer(GKeyFile *key_file,
                            const gchar *group_name,
                            const gchar *key,
                            GError **error);

Returns the value associated with key under group_name as an integer.

If key cannot be found then 0 is returned and error is set to G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value associated with key cannot be interpreted as an integer then 0 is returned and error is set to G_KEY_FILE_ERROR_INVALID_VALUE.

    key_file : a GKeyFile
    group_name : a group name
    key : a key
    error : return location for a GError

Returns : the value associated with the key as an integer, or 0 if the key was not found or could not be parsed.

g_key_file_set_integer ()

void g_key_file_set_integer(GKeyFile *key_file,
                            const gchar *group_name,
                            const gchar *key,
                            gint value);

Associates a new integer value with key under group_name. If key cannot be found then it is created.

    key_file : a GKeyFile
    group_name : a group name
    key : a key
    value : an integer value

g_key_file_to_data ()

gchar * g_key_file_to_data(GKeyFile *key_file,
                           gsize *length,
                           GError **error);

This function outputs key_file as a string.

Note that this function never reports an error, so it is safe to pass NULL as error.

    key_file : a GKeyFile
    length : return location for the length of the returned string, or NULL
    error : return location for a GError, or NULL

Returns : a newly allocated string holding the contents of the GKeyFile

g_file_set_contents ()

gboolean g_file_set_contents(const gchar *filename,
                             const gchar *contents,
                             gssize length,
                             GError **error);

Writes all of contents to a file named filename, with good error checking. If a file called filename already exists it will be overwritten.

This write is atomic in the sense that it is first written to a temporary file which is then renamed to the final name. Notes:

    * On Unix, if filename already exists hard links to filename will break. Also since the file is recreated, existing permissions, access control lists, metadata etc. may be lost. If filename is a symbolic link, the link itself will be replaced, not the linked file.
    * On Windows renaming a file will not remove an existing file with the new name, so on Windows there is a race condition between the existing file being removed and the temporary file being renamed.
    * On Windows there is no way to remove a file that is open to some process, or mapped into memory. Thus, this function will fail if filename already exists and is open.

If the call was sucessful, it returns TRUE. If the call was not successful, it returns FALSE and sets error. The error domain is G_FILE_ERROR. Possible error codes are those in the GFileError enumeration.

    filename : name of a file to write contents to, in the GLib file name encoding
    contents : string to write to the file
    length : length of contents, or -1 if contents is a nul-terminated string
    error : return location for a GError, or NULL

Returns : TRUE on success, FALSE if an error occurred

此外还要注意keyfile的flags设定,其实现如下:
enum GKeyFileFlags
typedef enum
{
  G_KEY_FILE_NONE              = 0,
  G_KEY_FILE_KEEP_COMMENTS     = 1 << 0,
  G_KEY_FILE_KEEP_TRANSLATIONS = 1 << 1
} GKeyFileFlags;

描述如下:
Flags which influence the parsing.
G_KEY_FILE_NONE
    No flags, default behaviour
G_KEY_FILE_KEEP_COMMENTS
    Use this flag if you plan to write the (possibly modified) contents of the key file back to a file; otherwise all comments will be lost when the key file is written back.
G_KEY_FILE_KEEP_TRANSLATIONS
    Use this flag if you plan to write the (possibly modified) contents of the key file back to a file; otherwise only the translations for the current language will be written back.

For more information please refer to these website:
http://library.gnome.org/devel/glib/unstable/glib-Key-value-file-parser.html
http://library.gnome.org/devel/glib/unstable/glib-File-Utilities.html


阅读(2437) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~