2012-12-13 26 views
1

文件/文件夹我在C以下代码:确定用C

DIR *mydir = opendir("/"); 
struct dirent *entry = NULL; 

while((entry = readdir(mydir))) 
{ 
    printf("%s\n", entry->d_name); 
    //printf("%i\n", entry->d_type); 
} 

closedir(mydir); 

它的工作原理,并显示在该位置的文件/文件夹,正确。

但是,我想告诉它,如果它是一个文件夹或文件。我怎样才能做到这一点?我试着用d_type(正如你在代码中看到的那样),但没有成功。

回答

3

使用stat()

struct stat st; 
stat("nodename", &st); 
int isDirectory = S_ISDIR(st.st_mode); 
1

您应该使用stat()功能至极给你一个stat结构。

struct stat s; 
if(stat(path,&s) == 0) 
{ 
    if(s.st_mode & S_IFDIR) 
    { 
     //it's a directory 
    } 
    else if(s.st_mode & S_IFREG) 
    { 
     //it's a file 
    } 
    else 
    { 
     //something else 
    } 
} 
else 

{ 
    //error 
} 
0

您可以使用内置的宏是这样的:

#include <sys/stat.h> 
#include <unistd.h> 
#include <stdio.h> 

int main(void) 
{ 
    DIR *mydir = opendir(/); 
    struct dirent *entry = NULL; 
    struct stat buf; 

    while((entry = readdir(mydir))) 
    { 
    printf("%s\n", entry->d_name); 
    if (stat(entry, &buf)) 
    { 
     perror("stat"); 
     exit(-1); 
    } 
    if (S_ISDIR(buf.st_mode)) 
    { 
     printf("%s is a directory\n", entry); 
    } 
    if (S_ISREG(buf.st_mode)) 
    { 
     printf("%s is a regular file\n", entry); 
    } 
    } 

    closedir(mydir); 

    return 0; 
} 

man 2 stat在shell以获取更多信息。

0

这是系统特定的,如果不知道您的操作系统和其他可能的设置,我们无法给出完全可靠的答案。

d_type实际上确实适用于至少某些系统。你的代码在RedHat Linux上给出了一个有用的答案,对于目录值为4,对于常规文件为8,对于其他文件类型则为其他值。这是一个修正错字周围名称/在调用opendir与引号。