简介
GLib提供了一系列可移植的文件操作函数,大概有以下几类。
- 基础操作函数:一般都有对应的C标准函数,但这些函数实现了不同操作系统的封装,因此使用这些函数写的程序可以移植到其他操作系统上编译运行。
- 文件操作函数:包括读取设置文件内容,检测文件是否存在,读取符号链接文件的真实内容。
- 目录操作函数:包括目录打开、读取、关闭、创建多级目录、重新进入目录等操作。
- 临时文件及临时目录操作相关函数可对临时文件及临时目录进行操作。
- 内存映射操作函数:是指基于mmap的文件到内存映射的一组函数。
数据结构
enum GFileError // 文件操作错误宏
enum GFileTest // 文件类型判断宏(如普通文件、目录、符号链接等)
GDir // 目录操作,这是一个不透明结构体,其内部成员不可被直接访问
GMappedFile // 内存映射操作结构体,这也是一个不透明结构体
typedef GStatBuf // stat()系统调用返回的结果
函数列表
GFileError g_file_error_from_errno ()
gboolean g_file_get_contents ()
gboolean g_file_set_contents ()
gboolean g_file_test ()
gint g_mkstemp ()
gint g_mkstemp_full ()
gint g_file_open_tmp ()
gchar * g_file_read_link ()
gint g_mkdir_with_parents ()
gchar * g_mkdtemp ()
gchar * g_mkdtemp_full ()
gchar * g_dir_make_tmp ()
GDir * g_dir_open ()
const gchar * g_dir_read_name ()
void g_dir_rewind ()
void g_dir_close ()
GMappedFile * g_mapped_file_new ()
GMappedFile * g_mapped_file_new_from_fd ()
GMappedFile * g_mapped_file_ref ()
void g_mapped_file_unref ()
void g_mapped_file_free ()
gsize g_mapped_file_get_length ()
gchar * g_mapped_file_get_contents ()
GBytes * g_mapped_file_get_bytes ()
int g_open ()
int g_rename ()
int g_mkdir ()
int g_stat ()
int g_lstat ()
int g_unlink ()
int g_remove ()
int g_rmdir ()
FILE * g_fopen ()
FILE * g_freopen ()
int g_chmod ()
int g_access ()
int g_creat ()
int g_chdir ()
int g_utime ()
gboolean g_close ()
函数功能分类
基础操作函数
int g_open ()
int g_rename ()
int g_mkdir ()
int g_stat ()
int g_lstat ()
int g_unlink ()
int g_remove ()
int g_rmdir ()
FILE * g_fopen ()
FILE * g_freopen ()
int g_chmod ()
int g_access ()
int g_creat ()
int g_chdir ()
int g_utime ()
gboolean g_close ()
文件操作函数
GFileError g_file_error_from_errno ()
gboolean g_file_get_contents ()
gboolean g_file_set_contents ()
gboolean g_file_test ()
gchar * g_file_read_link ()
目录操作函数
GDir * g_dir_open ()
const gchar * g_dir_read_name ()
void g_dir_rewind ()
void g_dir_close ()
gint g_mkdir_with_parents ()
临时文件和临时目录操作
gint g_mkstemp ()
gint g_mkstemp_full ()
gint g_file_open_tmp ()
gchar * g_mkdtemp ()
gchar * g_mkdtemp_full ()
gchar * g_dir_make_tmp ()
内存映射操作函数
GMappedFile * g_mapped_file_new ()
GMappedFile * g_mapped_file_new_from_fd ()
GMappedFile * g_mapped_file_ref ()
void g_mapped_file_unref ()
void g_mapped_file_free ()
gsize g_mapped_file_get_length ()
gchar * g_mapped_file_get_contents ()
GBytes * g_mapped_file_get_bytes ()
函数功能说明及综合演示
基础操作函数
int g_open () // 同标准open函数,打开文件
int g_rename () // 同标准rename函数,重命名文件
int g_mkdir () // 同标准mkdir函数,创建目录
int g_stat () // 同标准stat函数,查看文件状态
int g_lstat () // 同标准stat函数,查看符号链接本身的状态,而不是符号链接指向的文件的状态
int g_unlink () // 同标准unlink函数,删除文件
int g_remove () // 同标准remove,删除文件或目录,当是文件时,其内部会调用unlink,当是目录时,其内部会调用rmdir
int g_rmdir () // 同标准rmdir,删除目录
FILE * g_fopen () // 同标准fopen函数,打开文件
FILE * g_freopen () // 同标准freopen函数,重新打开文件,一般用于stdin和stdout标准输入输出重定向
int g_chmod () // 同标准chmod函数,修改权限
int g_access () // 同标准access函数,文件是否存在,文件权限检查
int g_creat () // 同标准creat函数,
int g_chdir () // 同标准creat函数,修改进程的目录
int g_utime () // 同标准utime函数,access、modification时间戳修改函数
gboolean g_close () // 同标准close函数,关闭文件句柄
文件操作函数
GFileError g_file_error_from_errno () // 根据errno生成GFileError
gboolean g_file_get_contents () // 获取文件内容
gboolean g_file_set_contents () // 向文件写入内容,如果文件已经存在,则其内容会被覆盖。写入操作是原子的,其会先将文件写入一缓存文件,再进行一次重命名。
gboolean g_file_test () // 检测文件或目录。是否为普通文件、符号链接文件、目录、可执行文件、是否存在。
gchar * g_file_read_link () // 读取符号链接的实际内容
目录操作函数
GDir * g_dir_open () // 打开一个目录
const gchar * g_dir_read_name () // 读取目录内的内容,"."和".."会被忽略。
void g_dir_rewind () // 重置目录读取位置,如果调用该接口,g_dir_read_name会返回目录的第一个条目。
void g_dir_close () // 关闭一个目录
gint g_mkdir_with_parents () //创建一个目录,如果父目录不存在,则父目录被依次创建。
目录操作函数举例:
源码见glib_examples\glib_filefunctions\glib_filefunctions_dir
#include <glib.h>
void _file_utils_dir_func(const gchar *path)
{
const gchar *name = NULL;
GDir *dir = NULL;
gchar *fullname = NULL;
GError *error;
if(NULL == path) {
g_print("param is NULL \n");
return;
}
dir = g_dir_open(path, 0, &error);
while(NULL != (name = g_dir_read_name(dir))){
fullname = g_strconcat(path, "/", name, NULL);
if(g_file_test(fullname, G_FILE_TEST_IS_DIR)) {
g_print("D:%s \n", fullname);
_file_utils_dir_func(fullname);
} else {
g_print("F:%s \n", fullname);
}
g_free(fullname);
}
g_dir_close(dir);
}
void test_file_utils_dir_func(void)
{
g_print("\n");
_file_utils_dir_func(".");
}
gint main(gint argc, gchar **argv)
{
g_test_init(&argc, &argv, NULL);
g_test_add_func("/file_utils/dir", test_file_utils_dir_func);
return g_test_run();
}
运行结果:
[root@centos7 glib_filefunctions_dir]# ./glib_filefunctions_dir
/file_utils/dir:
D:./CMakeFiles
D:./CMakeFiles/glib_filefunctions_dir.dir
F:./CMakeFiles/glib_filefunctions_dir.dir/depend.make
F:./CMakeFiles/glib_filefunctions_dir.dir/link.txt
F:./CMakeFiles/glib_filefunctions_dir.dir/cmake_clean.cmake
F:./CMakeFiles/glib_filefunctions_dir.dir/build.make
F:./CMakeFiles/glib_filefunctions_dir.dir/DependInfo.cmake
F:./CMakeFiles/glib_filefunctions_dir.dir/flags.make
F:./CMakeFiles/glib_filefunctions_dir.dir/progress.make
F:./CMakeFiles/glib_filefunctions_dir.dir/C.includecache
F:./CMakeFiles/glib_filefunctions_dir.dir/depend.internal
F:./CMakeFiles/glib_filefunctions_dir.dir/glib_filefunctions_dir.c.o
F:./CMakeFiles/CMakeDirectoryInformation.cmake
F:./CMakeFiles/progress.marks
F:./Makefile
F:./cmake_install.cmake
F:./glib_filefunctions_dir
OK
[root@centos7 glib_filefunctions_dir]#
临时文件及临时目录操作函数
临时文件操作最重要的两个函数是g_mkstemp和g_mkdtemp,前者创建临时文件,后者创建临时目录。
//创建临时文件。临时文件名必须包含“XXXXXX”,且不能是常量字符串形式,因为“XXXXXX”会被替换。临时文件可以有目录,但目录必须存在。
gint g_mkstemp ()
//创建临时文件,可指定文件的权限和O_EXCL、O_CREAT标识。
gint g_mkstemp_full ()
//创建临时文件。临时文件名必须包含“XXXXXX”,只能是文件名,不能带目录,创建的临时文件在g_get_tmp_dir()得到的目录中。
gint g_file_open_tmp ()
//创建临时目录。与g_mkstemp类似,临时文件名必须包含“XXXXXX”,且不能是常量字符串形式。
gchar * g_mkdtemp ()
//创建临时文件,与g_mkdtemp类似,但可以指定目录创建的权限。
gchar * g_mkdtemp_full ()
//创建临时文件。与g_file_open_tmp类似,临时文件名只能是文件名,不可带目录,创建的临时目录在g_get_tmp_dir()得到的目录中。
gchar * g_dir_make_tmp ()
临时文件及临时目录操作函数举例:
源码见glib_examples\glib_filefunctions\glib_filefunctions_tmp
#include <glib.h>
void test_file_utils_mkstemp_func(void)
{
gchar tmpfile[16] = "/tmp/abcXXXXXX";
gint fd = 0;
fd = g_mkstemp(tmpfile);
g_print("file:%s fd:%d \n", tmpfile, fd);
g_close(fd);
g_unlink(tmpfile);
}
void test_file_utils_file_open_tmp_func(void)
{
gint fd = 0;
gchar tmpfile[16] = "ABCXXXXXX";
gchar *name_used = NULL;
GError *error = NULL;
fd = g_file_open_tmp(tmpfile, &name_used, &error);
g_print("file:%s fd:%d \n", tmpfile, fd);
g_close(fd);
g_unlink(tmpfile);
}
void test_file_utils_mkdtemp_func(void)
{
gchar tmpdir[32] = "Dir-mkdtemp-XXXXXX";
gchar *ret = NULL;
ret = g_mkdtemp(tmpdir);
g_print("ret: %s, tmpdir: %s \n", ret, tmpdir);
g_rmdir(tmpdir);
}
gint main(gint argc, gchar **argv)
{
g_test_init(&argc, &argv, NULL);
g_test_add_func("/file_utils/mkstemp", test_file_utils_mkstemp_func);
g_test_add_func("/file_utils/file_open_tmp", test_file_utils_file_open_tmp_func);
g_test_add_func("/file_utils/mkdtemp", test_file_utils_mkdtemp_func);
return g_test_run();
}
运行结果:
[root@centos7 glib_filefunctions_tmp]# ./glib_filefunctions_tmp
/file_utils/mkstemp: file:/tmp/abcTER3F1 fd:3
OK
/file_utils/file_open_tmp: file:ABCXXXXXX fd:3
OK
/file_utils/mkdtemp: ret: Dir-mkdtemp-JKR3F1, tmpdir: Dir-mkdtemp-JKR3F1
OK
[root@centos7 glib_filefunctions_tmp]#
内存映射操作函数
GLib提供的内存映射操作函数不如系统本身提供的函数功能强大,这里不推荐使用,也不多介绍了。
GMappedFile * g_mapped_file_new ()
GMappedFile * g_mapped_file_new_from_fd ()
GMappedFile * g_mapped_file_ref ()
void g_mapped_file_unref ()
void g_mapped_file_free ()
gsize g_mapped_file_get_length ()
gchar * g_mapped_file_get_contents ()
GBytes * g_mapped_file_get_bytes ()