2009-11-27 49 views

回答

0

你可以檢查路徑是否指向,然後你打電話給 fopen?

+0

(也許這應該是一個評論。)當然,我可以的 – Wevah 2009-11-27 23:18:18

+0

,但基本上就是我要問,怎麼我會檢查嗎? – adhanlon 2009-11-27 23:22:06

+0

也許我對此並不清楚,但是我不能通過查看'/'是否在最後來判斷它是否是目錄來檢查路徑,因爲它不是'/'的必需條件。最後它會成爲一個目錄 – adhanlon 2009-11-27 23:29:50

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 ; 
} 
+0

這個更好。 – Wevah 2009-11-28 00:16:58

0

使用stat()文件名,你打開它之前,或FSTAT()的文件描述符的fileno(returned_file)。

+0

我試過使用統計,它返回一個結構統計,現在使用該結構如何確定它是否是一個目錄? – adhanlon 2009-11-27 23:41:08

+0

請勿使用stat,請使用fstat。在打開它之後,您總是需要檢查以避免它在檢查時是文件的競爭狀態,但是在打開完成之前被刪除並轉換爲目錄。 – janm 2009-11-28 01:23:07

4

詳細解釋其他答案,您可以在返回的文件描述符上調用fstat,並檢查st_modeS_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"); 
    } 
    } 
+0

也可以使用的S_ISDIR(buf.st_mode) – DanM 2009-11-28 01:45:33

相關問題