用于目录访问的C库

时间:2009-07-04 23:27:35

标签: c directory

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

无论如何,我想知道是否有一个很好的跨平台C库来处理目录。在一个绝对的压力,我可以自己动手在POSIX和Windows上工作,但我想知道是否有任何好的已经在那里。我一直在考虑使用GLib或者Apache Portable Runtime,但是这两款产品都比我真正需要的更多很多,并且我希望保持相当轻量级。我还考虑过使用流行的脚本语言的内部结构,比如Perl或Python,但这对于目录函数来说似乎也有很多开销。

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

  

我一直在考虑使用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库或重新发明轮子。

答案 2 :(得分:0)

我认为你应该使用APR或类似的东西。设计一个POSIX API然后为它实现它在我的经验中效果不好(我必须承认这是非常有限的。)

文件IO和相关语义太不相同,因此您必须设计API以立即处理窗口。可以放在公共API中的内容也有不同的限制。这种问题的一个例子是用于文件处理的python C API。它显然是用POSIX POV设计的,并且很难在Windows上使用它,因为共享C运行时对象等等......