【问题标题】:C libraries for directory access用于目录访问的 C 库
【发布时间】:2010-11-08 03:56:05
【问题描述】:

我知道标准 C 语言无法让我对文件夹执行任何操作,但我想要一种相当便携且跨平台的方式来访问文件夹。这时,我需要做的就是创建一个文件夹,检查一个文件夹是否存在,并可能删除一个文件夹。我可以预见在不久的将来需要从文件夹中读取文件,但这不是一个非常紧迫的需求。

无论如何,我想知道是否有一个很好的跨平台 C 库来处理目录。在绝对紧要关头,我可能会自己动手在 POSIX 和 Windows 上工作,但我想知道那里是否已经有任何好的。我一直在考虑 GLib 或 Apache Portable Runtime,但它们都提供了 很多 比我真正需要的东西,而且我想保持这个相当轻量级。我也考虑过使用流行脚本语言的内部结构,比如 Perl 或 Python,但这对于目录函数来说似乎也有很多开销。

如果有人有任何我应该研究的内容要添加到此列表中,或者想为我已经列出的选项之一提供一个很好的案例,请告诉我。我不想听起来像我在要求代码,但是如果您发布了一个像 int direxist(char *dirname) 这样的简单函数,如果目录存在则返回 true,否则返回 false,只是为了说明您选择的库的 API,那将真的很棒,我想不会太难。如果你想提倡使用 POSIX/滚动我自己的,也这样做,因为我很喜欢自己动手学习这样的新东西。

只是为了确保,我想要 C,而不是 C++。我确信 boost 很好,但我对 C++ 解决方案不感兴趣。

【问题讨论】:

标签: c directory


【解决方案1】:

我会加入 APR 的潮流。它确实为您提供了比目录访问更多的功能,但它是我使用过的最好的多平台 C 库。将来您可能会发现自己需要它的其他一些组件,因此您不妨将它们放在手边。

另一种选择是在 Win32 上实现 POSIX API 集,并在 POSIX 中编写所有内容。这里的好处是 Windows 正在迅速成为唯一不包含 POSIX 运行时实现的现代操作系统。

【讨论】:

    【解决方案2】:

    我一直在考虑 GLib 或 Apache Portable Runtime,但它们都提供了比我真正需要的东西多得多的东西,我想保持它相当轻量级。

    很可能已经安装了 GLib(至少在 GNU/Linux 上)。唯一的问题是它会添加一个依赖项。

    我也考虑过使用流行脚本语言的内部结构,比如 Perl 或 Python,但这对于目录函数来说似乎也有很多开销。

    我宁愿首先使用 Python,并且可能将 C 用于特定的代码部分。

    >>> def direxist(dirname):
    ...     return os.path.isdir(dirname)
    ... 
    >>> direxist('/')
    True
    >>> direxist('/home')
    True
    >>> direxist('/home/bastien/Petites leçons de typographie.pdf')
    False
    

    关于编写自己的 C 函数,它会是这样的:

    #include <stdio.h>
    
    #ifdef _WIN32
    #include <windows.h>
    #else
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #endif
    
    int direxist(const char* dirname)
    {
    #ifdef _WIN32
        /* ... */
    #else
        struct stat fileinfo;
        int ret = -1;
    
        if (stat(dirname, &fileinfo) == -1)
        {
            perror("direxist");
        }
        else
        {
            if (S_ISDIR(fileinfo.st_mode))
            {
                ret = 1;
            }
            else
            {
                ret = 0;
            }
        }
    
        return ret;
    #endif
    }
    
    int
    main (void)
    {
        printf("%d\n", direxist("/"));
    
        return 0;
    }
    

    我不知道怎么用 Win32 做,所以你会自己找到。

    但是,我强烈建议使用外部库。仅使用 C 库或重新发明轮子不会走得太远。

    【讨论】:

    • 我在 OS X 上,所以我没有免费的 GLib。我有时觉得 OS X 是 OS 可移植性的红发继子——尽管它非常接近 POSIX,但没有人真正考虑过它。我不想使用 Python,因为我(还)不了解 Python,我宁愿用 C 编写它(个人偏好)。我不介意添加依赖项,但我想先了解我的选择。
    • @Chris:如果 GTK+ 可以在 OS X 上运行,我很确定 GLib 也可以运行。我的猜测是这个包包含 GLib:gtk-osx.org.
    • 我检查了——那个包包含 GTK+ 和 GLib,但它安装在 Xcode 文件夹下,我通常通过命令行工作,所以有点不方便。不过我会看看我能做些什么。
    【解决方案3】:

    我认为您应该使用 APR 或类似的东西。根据我的经验,设计一个 POSIX API 然后在 Windows 上实现它并不能很好地工作(我必须承认这是非常有限的)。

    文件 IO 和相关语义实在是太不一样了,所以你必须马上设计你的 API 来处理 windows。对于可以放入公共 API 的内容也有不同的限制。此类问题的一个示例是用于文件处理的 python C API。它显然是用 POSIX POV 设计的,由于共享 C 运行时对象等原因,在 Windows 上使用它非常困难......

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 2019-05-29
      • 2011-01-21
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      相关资源
      最近更新 更多