我在做一個HTTP服務器,當我得到他們請求文件的路徑我下面打開它:有沒有簡單的方法來判斷文件流是否打開了目錄而不是文件?
returned_file = fopen(path, "r");
這(相反的是我想)成功即使路徑是目錄。有沒有簡單的方法來檢查returned_file流是否是目錄而不是文件?
我在做一個HTTP服務器,當我得到他們請求文件的路徑我下面打開它:有沒有簡單的方法來判斷文件流是否打開了目錄而不是文件?
returned_file = fopen(path, "r");
這(相反的是我想)成功即使路徑是目錄。有沒有簡單的方法來檢查returned_file流是否是目錄而不是文件?
你可以檢查路徑是否指向,然後你打電話給 fopen?
你可以在fopen返回的文件描述符上使用fstat。
編輯: 這裏是和示例程序:
#include <sys/stat.h>
#include <stdio.h>
void printISDir(FILE* fp, char const * name) {
int fdes = fileno(fp) ;
struct stat fileInfo ;
fstat(fdes, &fileInfo) ;
if (S_ISDIR(fileInfo.st_mode)) {
printf("%s: I'm a dir!\n", name) ;
} else {
printf("%s: I'm a file!\n", name) ;
}
}
int main(int argc, char** argv) {
char const * directoryName = "/etc" ;
char const * fileName = "/etc/hosts" ;
FILE* dirFp = fopen(directoryName, "r") ;
FILE* fileFp = fopen(fileName, "r") ;
printISDir(dirFp, directoryName) ;
printISDir(fileFp, fileName) ;
fclose(dirFp) ;
fclose(fileFp) ;
return 0 ;
}
這個更好。 – Wevah 2009-11-28 00:16:58
詳細解釋其他答案,您可以在返回的文件描述符上調用fstat,並檢查st_mode
的S_IFDIR
位。該S_ISDIR幫手宏是有幫助的:
#include <sys/stat.h>
...
FILE* f = fopen(path, "r");
struct stat buf;
if (fstat(fileno(f), &buf) == -1) {
perror("fstat");
} else {
if (S_ISDIR(buf.st_mode)) {
printf("is directory\n");
} else {
printf("not directory\n");
}
}
也可以使用
(也許這應該是一個評論。)當然,我可以的 – Wevah 2009-11-27 23:18:18
,但基本上就是我要問,怎麼我會檢查嗎? – adhanlon 2009-11-27 23:22:06
也許我對此並不清楚,但是我不能通過查看'/'是否在最後來判斷它是否是目錄來檢查路徑,因爲它不是'/'的必需條件。最後它會成爲一個目錄 – adhanlon 2009-11-27 23:29:50