2015-05-20 59 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()函數。

但是你實際上無法從目錄中讀取。

相關問題