我想在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或數據庫位置。古典文件系統無論如何都註定要失敗。 –