我试图在C中创建一个程序,它获取目录的路径并使用里面的文件进行处理。
有没有办法在不使用dirent.h
或dir.h
?
此外,是否有任何函数可以打开带有fopen
等网址的目录,但是会打开带有网址路径的文件?
答案 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()
函数。
但你实际上无法从目录中读取。