在glib或libc中是否有类似boost :: filesystem :: remove_all(path)的函数?

时间:2017-04-12 19:19:33

标签: c linux glibc glib libc

我不能使用boost,只能使用glib和libc函数。

如果你检查glib,你会发现g_remove,g_rmdir和g_unlink,但没有一个删除非空目录。

我见过实现函数的帖子,以递归方式删除目录中的所有文件和子目录,如Linux命令“rm -rf path”。

我更喜欢在C中使用经过良好测试的实现。

您推荐哪种实现/ api?

感谢。

1 个答案:

答案 0 :(得分:2)

目前GIO中没有任何内容可以实现rm -rf的等价物,但你可以构建一些相当容易的东西:

/* Recursively delete @file and its children. @file may be a file or a directory. */
static gboolean
rm_rf (GFile         *file,
       GCancellable  *cancellable,
       GError       **error)
{
  g_autoptr(GFileEnumerator) enumerator = NULL;

  enumerator = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME,
                                          G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
                                          cancellable, NULL);

  while (enumerator != NULL)
    {
      GFile *child;

      if (!g_file_enumerator_iterate (enumerator, NULL, &child, cancellable, error))
        return FALSE;
      if (child == NULL)
        break;
      if (!rm_rf (child, cancellable, error))
        return FALSE;
    }

  return g_file_delete (file, cancellable, error);
}

请注意,使用g_autoptr()需要GLib 2.44和支持自动清理的编译器(目前只支持GCC或Clang)。 g_file_enumerator_iterate()也需要GLib 2.44。