【发布时间】:2009-11-27 23:13:56
【问题描述】:
我正在制作一个 HTTP 服务器,当我获得他们请求的文件的路径时,我使用以下命令打开它:
returned_file = fopen(path, "r");
即使路径是目录,这(与我的想法相反)也会成功。有没有一种简单的方法可以检查返回的文件流是目录而不是文件?
【问题讨论】:
我正在制作一个 HTTP 服务器,当我获得他们请求的文件的路径时,我使用以下命令打开它:
returned_file = fopen(path, "r");
即使路径是目录,这(与我的想法相反)也会成功。有没有一种简单的方法可以检查返回的文件流是目录而不是文件?
【问题讨论】:
您可以在 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 ;
}
【讨论】:
详细说明其他答案,您可以在返回的文件描述符上调用 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");
}
}
【讨论】:
您能否检查路径是否指向您调用 fopen之前的目录?
【讨论】:
在打开文件之前对文件名使用 stat(),或者使用 fstat() 文件描述符 fileno(returned_file)。
【讨论】: