【问题标题】:Is there a similar function to boost::filesystem::remove_all(path) in glib or libc?glib 或 libc 中是否有与 boost::filesystem::remove_all(path) 类似的功能?
【发布时间】:2017-04-12 19:19:33
【问题描述】:

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

如果你检查 glib,你会发现 g_remove、g_rmdir 和 g_unlink,它们都不会删除非空目录。

我看到一些帖子实现了递归删除目录中所有文件和子目录的功能,例如 Linux 命令“rm -rf path”。

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

您推荐哪种实现/api?

谢谢。

【问题讨论】:

  • 你能使用 GIO 和 GLib 的函数吗?

标签: c linux glibc glib libc


【解决方案1】:

目前在 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。

【讨论】:

  • +1;也许我会提到g_autoptrg_file_enumerator_iterate 是相当新的“现象”,但我发现这是一个非常优雅的解决方案。
  • 我已经对其进行了编辑以澄清这一点。它们只需要 GLib 2.44,它现在已经很老了(我们刚刚发布了 GLib 2.56),但值得指出的是 g_autoptr() 仅适用于 GCC 或 Clang。
猜你喜欢
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多