|
|
我是用opendir()打开,然后用readdir()读目录,之后用stat()获得文件信息,但问题 是只有在读当前目录时正常,非当前目录就会出现找不到文件的错误,我是新手,不知有没人愿意帮助看一下,万分感激,我想问题应该是stat()在所获得路径有问题,但不知该怎么办.
- #include<stdio.h>
- #include<dirent.h>
- #include<sys/stat.h>
- #include<sys/types.h>
- #include<pwd.h>
- #include<grp.h>
- #include<string.h>
- DIR *dp;
- struct dirent *dirp;
- struct stat statbuf;
- void showfileinfo(char *filename, struct stat *buf);
- void dostat(char *filename);
- char *uid_to_name(uid_t);
- char *gid_to_name(gid_t);
- void do_ls(char[]);
- int main(int argc, char *argv[])
- {
- if (argc == 1)
- do_ls(".");
- else
- do_ls(argv[1]);
- }
- void do_ls(char dir[]) {
- if ((dp=opendir(dir))==NULL) {
- printf("can't open %s\n", dir);
- exit(1);
- }
- while ((dirp=readdir(dp))!=NULL)
- dostat(dirp->d_name);
- closedir(dp);
- exit(0);
- }
- void dostat(char *filename) {
- struct stat info;
- if (stat(filename,&info)==-1) {
- printf("stat file error!\n");
- exit(1);
- }
- else
- showfileinfo(filename,&info);
- }
- void showfileinfo(char *filename, struct stat *buf) {
- /*display the file info */
- char *uid_to_name(uid_t);
- char *ctime(time_t *);
- char *gid_to_name(gid_t);
- int mode=buf->st_mode;
- char str[11];
- strcpy(str, "----------");
- if(S_ISDIR(mode)) str[0] = 'd';
- if(S_ISLNK(mode)) str[0] = 'l';
- if(mode & S_IRUSR) str[1] = 'r';
- if(mode & S_IWUSR) str[2] = 'w';
- if(mode & S_IXUSR) str[3] = 'x';
- if(mode & S_IRGRP) str[4] = 'r';
- if(mode & S_IWGRP) str[5] = 'w';
- if(mode & S_IXGRP) str[6] = 'x';
- if(mode & S_IROTH) str[7] = 'r';
- if(mode & S_IWOTH) str[8] = 'w';
- if(mode & S_IXOTH) str[9] = 'x';
- printf("%s ", str);
- printf("%4d ", buf->st_nlink);
- printf("%-8s ", uid_to_name(buf->st_uid));
- printf("%-8s ", gid_to_name(buf->st_gid));
- printf("%8ld ", (long)buf->st_size);
- printf("%.12s ", 4+ctime(&buf->st_mtime));
- printf("%s\n", filename);
- }
- char *uid_to_name(uid_t uid)
- /*
- * returns pointer to username associated with uid, uses getpw()
- */
- {
- struct passwd *pw_ptr;
- static char numstr[10];
- if( (pw_ptr = getpwuid(uid)) == NULL)
- {
- printf(numstr, "%d", uid);
- return numstr;
- }
- else
- return pw_ptr->pw_name;
- }
- char *gid_to_name(gid_t gid)
- /*
- *returns pointer to groupname associated with gid, uses getgr()
- */
- {
- struct group *grp_ptr;
- static char numstr[10];
- if ((grp_ptr = getgrgid(gid)) == NULL)
- {
- sprintf(numstr, "%d", gid);
- return numstr;
- }
- else
- return grp_ptr->gr_name;
- }
复制代码 |
|