2017-03-18 28 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