2017-03-18 26 views
2

我使用的fopen,以确定我是否打开这样的文件或目录:c - fopen打开目录?

FILE *f; 

f = fopen(path, "r"); 

if (f != NULL){ 

// found file 

} 

else { 

// found a directory 

} 

和路径是当前指向一个目录,而不是一个文件的路径,它看起来是这样的:

/home/me/Desktop/newfolder 

但是,当我运行代码时,它说,它发现一个文件,即使它指向一个文件夹,因此它应该返回空指针,或不?

我正在使用Ubuntu。

+2

目录是一个类型的UNIX系统上的文件,粗略地讲... – StoryTeller

+0

我看到:fopen(path, "r+")那么如果path是指目录应该失败。那么,确定我是否试图打开文件或目录会更好? – Daeto

+1

为什么不使用'stat()'? – Dmitri

回答

3

C标准没有提及fopen荷兰国际集团的目录任何东西。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html说以下(重点煤矿):

fopen()函数功能将失败:
[...]
[EISDIR]指定的文件是一个目录,模式要求写访问

因此,如果您将fopen(path, "r")更改为例如

bool isDirectory(const char* path) { 
    FILE *f = fopen(path, "r+"); 
    if (f) { 
     fclose(f); 
     return false; 
    } 
    return errno == EISDIR; 
} 
+0

是的,这是诀窍!谢谢! – Daeto

+1

如果文件不在那里,是不是'w' _create_文件? – JHH

+4

@JHH它确实会不会更好? –

0

请先尝试:

#include <dirent.h> 

DIR* dir = opendir(path); 
if (dir) 
{ 
    /* Directory exists. Do stuff. */ 
    closedir(dir); 
} 
if(errno == ENOTDIR) 
{ 
    /* Exists but is not a directory */ 
} 
+0

问题是,我需要确定目录是否存在,以及输入是否是文件。 – Daeto

+0

因此,在知道它不是目录后,请检查它是否为文件:)但这不是必需的。我相信'errno == ENOTDIR'意味着有东西在那里,但不是一个目录,这意味着一个文件。 – JHH