用于目录访问的C库

3
我知道标准的C语言不能操作文件夹,但我希望找到一个相对便携、跨平台的方法来访问文件夹。目前,我只需要创建文件夹、检查文件夹是否存在,以及可能删除文件夹。未来可能需要从文件夹中读取文件,但这不是非常紧迫的需求。
我在想是否有一个好的跨平台C库可用于处理文件夹。如果必要的话,我可以自己编写代码来在POSIX和Windows上工作,但我想知道是否已经有好的库存在。我一直在考虑使用GLib或Apache Portable Runtime,但它们都比我需要的东西更多,而且我希望保持它相对轻量级。我也考虑过使用流行脚本语言(如Perl或Python)的内部,但这似乎也是为了使用文件夹函数而增加了很多开销。
如果有人能添加任何我应该查看的选项,或者为我已经列出的选项提供充分理由,请告诉我。我不想看起来像在要求代码,但如果你发布了一个简单的函数,如int direxist(char *dirname),它返回真值表示目录存在,否则返回假值,只是为了说明你选择的库的API,那就太棒了,并且我想这也不会太难。如果您想支持使用POSIX/自己编写代码,请这样做,因为我很喜欢通过自己动手学习新东西。
请注意,我需要的是C语言而不是C++。我相信boost很好,但我对C++的解决方案不感兴趣。

这个怎么样?--> https://github.com/cxong/tinydir - A P Jo
3个回答

3

我会选择使用APR。它不仅提供目录访问,而且是我使用过的最好的多平台C库。未来你可能需要使用其中的其他组件,所以最好保留它们。

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


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库是远远不够的,或者重新发明轮子也并不可取。


我使用的是OS X,所以没有免费的GLib可用。有时候我感觉OS X在操作系统可移植性方面像是被忽略的孩子,尽管它与POSIX非常接近,但似乎没有人真正关注它。我不想使用Python,因为我还不熟悉Python,而且我更愿意用C来编写(个人偏好)。我不介意添加依赖项,但我想先了解我的选择。 - Chris Lutz
@Chris:如果GTK+在OS X上可以工作,我非常确定GLib也可以。我猜这个软件包包含GLib:http://www.gtk-osx.org/。 - Bastien Léonard
我查了一下,那个软件包包含GTK+和GLib,但是它安装在Xcode文件夹下,并且我通常通过命令行工作,所以有点不方便。不过我会看看我能做些什么。 - Chris Lutz

0

我认为你应该使用APR或者类似的东西。根据我的经验,在设计一个POSIX API然后在Windows上实现它并不是很有效(我必须承认我的经验是相当有限的)。

文件IO和相关语义太过不同,因此你必须从一开始就设计好处理Windows的API。公共API中也存在着不同的限制。其中一个例子就是Python C API用于文件处理。它明显是从POSIX的角度设计的,因此由于共享C运行时对象等原因,在Windows上使用它非常困难...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接