2015-05-20 35 views

回答

3

C语言没有目录的概念所以没有使用它们的标准C方式。

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

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

+0

你能给我一个代码示例吗? – iYehuda

+0

@Begginer:opendir()的例子?还是第三方库的例子? – rodrigo

+0

比我最初想象的更有趣的问题(和答案)。我很习惯nix(和其他消费者设备)的分层文件系统,我忘记了那里可能有其他的东西。 “fopen”的* path *参数可以是任何内容,如URL或数据库位置。古典文件系统无论如何都注定要失败。 –

1

在现代类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()函数。

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

相关问题