函数

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 标志的比特字段。

返回值

类型: gboolean

测试是否为 TRUE。