/* * 根据命令行参数和完整路径名显示目标文件 * 参数flag: 命令行参数 * 参数pathname: 包含了文件名的路径名 */ void display (int flag, char *pathname) { int i, j; struct stat buf; char name[NAME_MAX + 1]; //从路径解析文件名 for (i = 0, j = 0; i < strlen(pathname); i++) { if (pathname[i] == '/') { j = 0; continue; } name[j++] = pathname[i]; } name[j] = '\0'; //用lstat解析链接文件 if (lstat (pathname, &buf) == -1) { my_err ("stat", errno); } switch (flag) { case PARAM_NONE: //无 -l, -a; if (name[0] != '.') { display_single (name); } break; case PARAM_A: //-a; display_single (name); break; case PARAM_L: //-l; if (name[0] != '.') { display_attribute (buf, name); printf (" %-s\n", name); } break; case PARAM_A + PARAM_L: //-a,-l display_attribute (buf, name); printf (" %-s\n", name); break; } }
/* * 根据命令行参数和完整路径名显示目标文件 * 参数flag: 命令行参数 * 参数pathname: 包含了文件的路径名 */ void display (int flag, char *pathname) { int i, j; struct stat buf; char name[PATH_MAX + 1]; /* 从路径中解析出文件名 */ for (i = 0, j = 0; i < strlen (pathname); i++) { if (pathname[i] == '/') { j = 0; continue; } name[j++] = pathname[i]; } name[j] = '\0'; /* lstat函数来方便解析链接文件,获取文件的状态信息 */ if (lstat (pathname, &buf) == -1) { my_err ("lstat", errno); } /* * 参数pathname指定文件的路径。 * 参数buf表示存储stat结构的缓冲区的地址。 * stat结构用于存储文件的状态信息。 */ switch (flag) { case PARAM_NONE: //没有-l和-a选项 if (name[0] != '.') display_single (name); break; case PARAM_A: display_single (name); break; case PARAM_L: //printf ("total %d\n", count); if (name[0] != '.') { display_attribute (buf, name); printf (" %-s\n", name); } break; case PARAM_A + PARAM_L: //printf ("total %d\n", count); display_attribute (buf, name); printf (" %-s\n", name); break; default: break; } }
void display(int flag,char* pathname) { int i,j; struct stat buf; char name[NAME_MAX+1]; //extract the file name from pathname; for(i=0,j=0;i<strlen(pathname);i++) { if(pathname[i]=='/') { j=0; continue; } name[j++]=pathname[i]; } name[j]='\0'; if(lstat(pathname,&buf)==-1) { my_err("lstat",errno,__LINE__); } switch(flag) { case PARAM_NONE://no any argument if(name[0]!='.') { display_single(name); } break; case PARAM_L://-l if(name[0]!='.') { display_attribute(buf,name); printf(" %-s\n",name); } break; case PARAM_A://-a //the first character of hidden files is '.'(dot) display_single(name); break; case PARAM_A+PARAM_L://-a -l display_attribute(buf,name); printf(" %-s\n",name); break; default: break; } }
void display_R(int flag,char *pathname) { int i,j; struct stat buf; char name[NAME_MAX + 1]; for(i=0,j=0;i<strlen(pathname);i++) { if(pathname[i] == '/') { j = 0; } else name[j++] = pathname[i]; } name[j] = 0; if(lstat(pathname,&buf) == -1) { my_error("stat",__LINE__); } if(flag == PARAM_NONE) { if(name[0] != '.')//不显示隐藏文件 { display_single(name); } } else if(flag == PARAM_A) { display_single(name); } else if(flag == PARAM_L) { if(name[0] != '.') { display_attribute(buf,name); printf(" %-s\n",name); } } else if(flag == (PARAM_A | PARAM_L)) { display_attribute(buf,name); printf(" %-s\n",name); } }
void display(int flag, char pathname[], int sT_INO) //是不是-i,name是文件名 { int i,j; struct stat buf; char name[NAME_MAX+1]; /*从路径中解析出文件*/ for(i=0,j=0; i<strlen(pathname); i++){ if(pathname[i]=='/'){ j=0; continue; } name[j++]=pathname[i]; } name[j]='\0'; /*用lstat而不是stat以方便解析链接文件*/ if( lstat(pathname, &buf) ==-1 ){ my_err("stat",__LINE__); } switch(flag){ case PARAM_NONE: //没有-l和-a选项 if(name[0] != '.'){ display_single(name,sT_INO,buf); } break; case PARAM_A: //-a显示包括隐藏文件在内的所有文件 display_single(name, sT_INO, buf); break; case PARAM_L: //-l每个文件单独占一行,显示文件详细属性信息 if(name[0] != '.'){ display_attribute(buf,name); printf(" %-s\n",name); } break; case PARAM_A+PARAM_L: //同时有-a和-l的选项 display_attribute(buf,name); printf(" %-s\n",name); break; default: break; } }
//信息输出 void output(struct stat *buf, char *path) { if (opt.a == 1) { if (opt.l == 1) { display_attribute(buf, path); } else { display_single(path); } } else { if (path[0] != '.') { if (opt.l == 1) { display_attribute(buf, path); } else { display_single(path); } } } }
void display(int flag, char *pathname) { int i, j; struct stat buf; char name[NAME_MAX+ 1]; for(i=0, j=0; i<strlen(pathname); i++) { if(pathname[i] == '/') { j = 0; continue; } name[j++] = pathname[i]; } name[j] = '\0'; if(lstat(pathname, &buf) == -1) { my_err("stat", __LINE__); } switch(flag) { case PARAM_NONE: if(name[0] != '.') { display_single(name); } break; case PARAM_A: display_single(name); break; case PARAM_L: if(name[0] != '.') { display_attribute(buf/*, name*/); printf(" %-s\n", name); } break; case PARAM_A + PARAM_L: display_attribute(buf/*, name*/); printf(" %-s\n", name); break; default: break; } }
int main(int argc, char * argv[]) { int i = 0,n; char a[6][20] = {"0","0","0","0","0","0"}; //存放命令,解析命令 char filename[N][100]; // struct stat buf; char name[100]; char name1[100]; DIR *dir; struct dirent *ptr; int j = 0; int k = 0; int l = 0; getcwd(name,100); if((dir = opendir(name)) == NULL) { printf("error\n"); exit(1); } while((ptr = readdir(dir)) != NULL) { strcpy(filename[l], ptr->d_name); //printf("filename[%d]: %s",l,filename[l]); l++; } //sort(filename); for(i = 1; i < argc; i++) { strcpy(a[i],argv[i]); } if(strcmp(a[1],"ls") == 0 && a[2][0] == '0') { n = my_readir(name,filename); } else if(strcmp(a[2],"-l") == 0 && a[3][0] == '0') { printf("ls -l\n"); for(i = 0; i < l;i++) { if(filename[i][0] != '.') display_attribute(filename[i]); } } else if(strcmp(a[2],"-a") == 0 && a[3][0] == '0') { printf("ls -a\n"); n =my_readirt(name,filename); } else if((strcmp(a[2],"-a") == 0 && strcmp(a[3],"-l") == 0 && a[4][0] == '0') || (strcmp(a[2],"-l") == 0 && strcmp(a[3],"-a") == 0 && a[4][0] == '0') || (strcmp(a[2],"-al") == 0 && a[3][0] == '0') || (strcmp(a[2],"-la") == 0 && a[3][0] == '0')) { printf("ls -al -la\n"); for(i = 0; i < l; i++) display_attribute(filename[i]); } else if(strcmp(a[2],"-R") == 0 && a[3][0] == '0') { printf("ls -R\n"); getcwd(name1,100); my_ls_r(name1); } else if(a[2][0] != '0') { printf("ls <filename>\n"); } else if(strcmp(a[2],"-i") == 0 && a[3][0] == '0') { n = my_readirt(name,filename); } else { printf("error1\n"); } return 0; }