函数
GLibfile_test
声明 [源代码]
gboolean
g_file_test (
const gchar* filename,
GFileTest test
)
描述 [源代码]
如果比特字段 test 中任何测试为 TRUE,则返回 TRUE。例如,当文件存在时,(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR) 将返回 TRUE;由于存在测试为 TRUE,因此不需要检查它是否是目录。使用当前的一系列可用测试,每次传入超过一个测试没有任何意义。
除了 G_FILE_TEST_IS_SYMLINK,所有测试都遵循符号链接,因此,对于指向常规文件的符号链接,g_file_test() 将针对 G_FILE_TEST_IS_SYMLINK 和 G_FILE_TEST_IS_REGULAR 返回 TRUE。
请注意,对于悬空符号链接,g_file_test() 将针对 G_FILE_TEST_IS_SYMLINK 返回 TRUE,而针对所有其他标志返回 FALSE。
您永远不应该使用 g_file_test() 来测试执行操作是否安全,因为在您实际执行操作之前条件始终有可能发生变化,请参见 TOCTOU。
例如,您可能认为可以使用 G_FILE_TEST_IS_SYMLINK 来判断是否可以安全写入文件,而不会被诱骗而写入不同的位置。这不起作用!
// DON'T DO THIS
if (!g_file_test (filename, G_FILE_TEST_IS_SYMLINK))
{
fd = g_open (filename, O_WRONLY);
// write to fd
}
// DO THIS INSTEAD
fd = g_open (filename, O_WRONLY | O_NOFOLLOW | O_CLOEXEC);
if (fd == -1)
{
// check error
if (errno == ELOOP)
// file is a symlink and can be ignored
else
// handle errors as before
}
else
{
// write to fd
}
需要注意的另一件事是,G_FILE_TEST_EXISTS 和 G_FILE_TEST_IS_EXECUTABLE 是使用 access() 系统调用实现的。通常这无关紧要,但如果您的程序是 setuid 或 setgid,这意味着这些测试会为 real user ID 和 group ID(而非 effective user ID 和 group ID)提供答案。
在 Windows 中,没有符号链接,因此测试 G_FILE_TEST_IS_SYMLINK 总是会返回 FALSE。测试 G_FILE_TEST_IS_EXECUTABLE 将仅检查文件是否存在,以及其名称是否表示它可执行,检查众所周知的文件扩展名以及在 PATHEXT 环境变量中列出的文件扩展名。
参数
filename
-
类型:
const gchar*
在 GLib 文件名编码中要测试的文件名。
数据归函数调用者所有。 该值是平台本机字符串,在 Unix 上使用首选操作系统编码,在 Windows 上使用 UTF-8。 test
-
类型:
GFileTest
GFileTest 标志的比特字段。