有没有办法使用stdio.h和stdlib.h从特定路径打开目录?

时间:2015-05-20 14:52:49

标签: c

我试图在C中创建一个程序,它获取目录的路径并使用里面的文件进行处理。 有没有办法在不使用dirent.hdir.h

的情况下执行此操作

此外,是否有任何函数可以打开带有fopen等网址的目录,但是会打开带有网址路径的文件?

2 个答案:

答案 0 :(得分:3)

C语言没有目录的概念,因此没有标准的C方式使用它们。

<dirent.h>是POSIX API,所以它应该可以在任何* nix操作系统中使用。其他ose有其他机制来读取目录。例如,在Windows中有FindFirstFile() / FindNextFile()

当然,您可以使用第三方操作系统无关的库,但它将使用任何这些API。

答案 1 :(得分:1)

在类似现代Unix的系统上,答案是否定(即使您可以打开一个目录进行阅读,但实际上无法从中读取)。

如果你回到历史足够远的地方,答案就是“有时”。如果你看看第二版K&amp; R的p183-4,你会看到代码直接读取目录。这根本不适用于当前版本的Unix。

您可以打开一个目录进行阅读,但是您无法再使用该目录。

$ cat opendot.c
#include <stdio.h>
int main(void)
{
    FILE *fp = fopen(".", "r");
    if (fp != 0)
    {
        printf("OK\n");
        char buffer[256];
        size_t nbytes;
        if ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp)) > 0)
        {
            for (size_t i = 0; i < nbytes; i++)
                printf("0x%.2X\n", buffer[i]);
        }
        else
            printf("Read failed\n");
        fclose(fp);
    }
    else
        printf("Failed\n");
    return 0;
}
$ make opendot
gcc -O3 -g -std=c11 -Wall -Wextra -Werror opendot.c -o opendot
$ ./opendot
OK
Read failed
$

(使用GCC 5.1.0在Mac OS X 10.10.3上测试。)

您可以使用open()打开目录进行阅读,主要是为了在fchdir()openat()等操作中使用文件描述符。 correctly identified the problem。上面说明的fopen()调用使用了下面的open()函数。

但你实际上无法从目录中读取。