C++ 有没有一种简单的方法来判断文件流是否打开了目录而不是文件?
我正在创建一个HTTP服务器,当我获得他们请求的文件路径时,我会用以下命令打开它:C++ 有没有一种简单的方法来判断文件流是否打开了目录而不是文件?,c++,file,directory,C++,File,Directory,我正在创建一个HTTP服务器,当我获得他们请求的文件路径时,我会用以下命令打开它: returned_file = fopen(path, "r"); 即使路径是目录,这(与我所想的相反)也会成功。是否有一种简单的方法可以检查返回的文件流是否是目录而不是文件?在调用fopen之前,您可以检查路径是否指向目录吗?您可以在fopen返回的文件描述符上使用fstat 编辑: 下面是一个示例程序: #include <sys/stat.h> #include <stdio.h>
returned_file = fopen(path, "r");
即使路径是目录,这(与我所想的相反)也会成功。是否有一种简单的方法可以检查返回的文件流是否是目录而不是文件?在调用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 ;
}
#包括
#包括
void printISDir(文件*fp,字符常量*name){
int fdes=文件编号(fp);
结构统计文件信息;
fstat(fdes和fileInfo);
if(S_ISDIR(fileInfo.st_模式)){
printf(“%s:我是目录!\n”,名称);
}否则{
printf(“%s:我是一个文件!\n”,名称);
}
}
int main(int argc,字符**argv){
char const*directoryName=“/etc”;
char const*fileName=“/etc/hosts”;
文件*dirFp=fopen(目录名,“r”);
FILE*fileFp=fopen(文件名为“r”);
printISDir(dirFp,directoryName);
printISDir(fileFp,文件名);
fclose(dirFp);
fclose(fileFp);
返回0;
}
在打开文件之前,在文件名上使用stat(),或在文件描述符fileno(返回的\u文件)上使用fstat()。详细说明其他答案,您可以在返回的文件描述符上调用fstat,并检查st\u模式
中的S\u IFDIR
位。S_ISDIR helper宏非常有用:
#include <sys/stat.h>
(也许这应该是一个评论。)当然可以,但这基本上就是我要问的,我该如何检查它?也许我不清楚这一点,但我不能通过查看“/”是否在末尾来检查路径,以判断它是否是一个目录,因为它不是一个“/”结尾的要求,所以它是一个目录。推荐的两个fstat之一是一个更好的选择。(我想我已经厌倦了Cocoa,我已经把一些普通的C语言推到一边了…)我试着使用stat,它返回一个struct stat,现在使用这个结构,我如何确定它是否是一个目录?不要使用stat,使用fstat。您总是需要在打开它之后进行检查,以避免出现争用情况,即在检查它时它是一个文件,但在打开完成之前被删除并转换为一个目录。也可以使用中的S_ISDIR(buf.st_模式)
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");
}
}