GIOChannel 與 檔案處理


基本檔案讀寫 中使用g_file_get_contents()、g_file_set_contents()函式,會對檔案作 整個讀取與整個寫入的動作,若您想要對檔案作一些逐字元、逐行讀取、附加等操作,則可以使用GIOChannel。

下面這個程式改寫 基本檔案讀寫 中的範例,使用GIOChannel來進行檔案讀寫的動作:
  • g_io_channel_demo.c
#include <glib.h>

handle_error(GError *error) {
if(error != NULL) {
g_printf(error->message);
g_clear_error(&error);
}
}

int main(int argc, char *argv[]) {
gchar *src, *dest;
GIOChannel *ioChannel;
gchar *content;
gsize length;
GError *error = NULL;

if(argc >= 3) {
src = argv[1];
dest = argv[2];
}
else {
return 1;
}

if (!g_file_test(src, G_FILE_TEST_EXISTS)) {
g_error("Error: File does not exist!");
}

ioChannel = g_io_channel_new_file(src, "r", &error);
handle_error(error);
g_io_channel_read_to_end(ioChannel, &content, &length, NULL);
g_io_channel_close(ioChannel);

ioChannel = g_io_channel_new_file(dest, "w", &error);
handle_error(error);
g_io_channel_write_chars(ioChannel, content, -1, &length, NULL);
g_io_channel_close(ioChannel);

g_free(content);

return 0;
}

您使用的是g_io_channel_new_file()函式來建立GIOChannel,建立時可以使用"r"、"w"、"a"、"r+"、"w+"、"a+"等檔案模式,其作用與使用 fopen() 時的模式相同。

程式中使用的是g_io_channel_read_to_end()函式,一次讀取所有的檔案內容,您也可以使用 g_io_channel_read_chars()、g_io_channel_read_line()、 g_io_channel_read_line_string()等函式,來對檔案作不同的讀取動作。