#include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <dirent.h> int main(int argc,char *argv[]){ int i; struct stat buf; char *ptr; if (argc<2){ printf("filename error"); exit(1); } if (lstat(argv[1],&buf)<0){//lstat和stat 判断文件属性,但lstat只判断连接文件本身,不追踪真实文件 perror("lstat error"); } if (S_ISREG(buf.st_mode)) ptr="普通文件"; else if(S_ISDIR(buf.st_mode)) ptr="目录"; else if(S_ISCHR(buf.st_mode)) ptr="字符设备"; else if(S_ISFIFO(buf.st_mode)) ptr="有名管道"; else if(S_ISLNK(buf.st_mode)) ptr="符号链接"; else if(S_ISBLK(buf.st_mode)) ptr="块设备"; else if(S_ISSOCK(buf.st_mode)) ptr="SOCKET"; else ptr="未知设备"; printf("FILE %s is %s file",argv[1],ptr); if (S_ISREG(buf.st_mode)){//如果是文件名 printf("file size is %d bytes.\n",buf.st_size); } //链接: http://deepfuture.javaeye.com/blog/763368 if (S_ISDIR(buf.st_mode)){//如果是目录名,则ls目录的文件 DIR *dp; struct dirent *dirp; if ((dp=opendir(argv[1]))==NULL) perror("opendir error"); while ((dirp=readdir(dp))!=NULL){ printf("%s\n",dirp->d_name); //输出目录下的文件名 } closedir(dp); free(dirp); } return 0; }