我正在创建一个HTTP服务器,当我得到他们请求的文件的路径时,我用以下内容打开它:
returned_file = fopen(path, "r");
即使路径是目录,这(与我的想法相反)也会成功。有没有一种简单的方法来检查returned_file流是否是目录而不是文件?
答案 0 :(得分:4)
你可以在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 ;
}
答案 1 :(得分:4)
详细说明其他答案,您可以在返回的文件描述符上调用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");
}
}
答案 2 :(得分:0)
您可以在调用fopen之前检查路径是否指向目录吗?
答案 3 :(得分:0)
在打开文件名之前使用stat(),或者在文件描述符fileno(returned_file)中使用fstat()。