2011-12-08 151 views
4

如何檢查這是目錄路徑還是任何文件名路徑?

Why does fopen("any_path_name",'r') not give NULL as return?

我結識,在linux下的目錄和文件都被認爲是文件。所以當我給讀取模式fopen任何目錄路徑或文件路徑它不給NULL文件描述符和?

那麼我該如何檢查它是否是dirctory路徑或文件路徑?如果我從命令參數獲得一些路徑?

+0

通常文件有擴展名,例如 「* .TXT」,「 * .log「,因此,基於此,你可以知道它是一個文件還是目錄,但是等待更好的答案 – ComputerSaysNo

+0

已經問過類似或相同的問題。 請參閱 http://stackoverflow.com/questions/1036625/differentiate-between-a-unix-directory-and-file-in-c和 http://stackoverflow.com/questions/146924/how-can -i-tell-if-a-given-path-is-a-directory-or-a-file-cc – riship89

+1

@DorinDuminica:在UNIX上下文中,依靠後綴來識別任何東西被認爲是不好的樣式。首先考慮文件屬性(如本例中的文件類型),然後嘗試使用'file'來標識文件,並且只有在沒有其他操作的情況下才會使用擴展名。 – thiton

回答

6

man 2 stat

NAME 
    fstat, fstat64, lstat, lstat64, stat, stat64 -- get file status 

... 

    struct stat { 
     dev_t   st_dev;   /* ID of device containing file */ 
     mode_t   st_mode;   /* Mode of file (see below) */ 

... 

    The status information word st_mode has the following bits: 

... 

    #define  S_IFDIR 0040000 /* directory */ 
2

感謝zed_0xff和LGOR OKS

這種東西都可以通過此示例代碼檢查

#include<stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
int main() 
{ 
struct stat statbuf; 

FILE *fb = fopen("/home/jeegar/","r"); 
if(fb==NULL) 
    printf("its null\n"); 
else 
    printf("not null\n"); 

stat("/home/jeegar/", &statbuf); 

if(S_ISDIR(statbuf.st_mode)) 
    printf("directory\n"); 
else 
    printf("file\n"); 
return 0; 
} 

輸出

its null 
directory 
相關問題