我想在C中制作一个程序,它获取一个目录的路径,并对里面的文件进行处理。 有没有办法做到这一点,而不使用dirent.h
或dir.h
?有没有办法使用stdio.h和stdlib.h从特定路径打开目录?
此外,是否有任何功能打开一个URL的目录,如fopen
,但打开文件的URL路径?
我想在C中制作一个程序,它获取一个目录的路径,并对里面的文件进行处理。 有没有办法做到这一点,而不使用dirent.h
或dir.h
?有没有办法使用stdio.h和stdlib.h从特定路径打开目录?
此外,是否有任何功能打开一个URL的目录,如fopen
,但打开文件的URL路径?
C语言没有目录的概念所以没有使用它们的标准C方式。
<dirent.h>
这是一个POSIX API,所以它应该可以在任何* nix OS中使用。其他ose有其他机制来读取目录。例如,在Windows中有FindFirstFile()
/FindNextFile()
。
当然,您可以使用第三方的操作系统不可知的库,但它将使用任何这些API。
在现代类Unix系统上,答案是否定的(即使您可以打开目录进行阅读,但实际上无法从中读取)。
如果你历史悠久,回答是“有时”。如果您查看第二版K & 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
$
(测试Mac OS X上10.10.3与GCC 5.1.0。)
您可以使用open()
打开一个目录,读取,主要目的是让你可以在诸如操作使用的文件描述符fchdir()
和 openat()
。上面所示的fopen()
调用使用下面的open()
函数。
但是你实际上无法从目录中读取。
你能给我一个代码示例吗? – iYehuda
@Begginer:opendir()的例子?还是第三方库的例子? – rodrigo
比我最初想象的更有趣的问题(和答案)。我很习惯nix(和其他消费者设备)的分层文件系统,我忘记了那里可能有其他的东西。 “fopen”的* path *参数可以是任何内容,如URL或数据库位置。古典文件系统无论如何都注定要失败。 –