Beispiel #1
0
/*
 * 	根据命令行参数和完整路径名显示目标文件
 * 	参数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;
	
	}

}
Beispiel #2
0
/*
 * 根据命令行参数和完整路径名显示目标文件
 * 参数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;
	}
}
Beispiel #3
0
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;
	}
}
Beispiel #4
0
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);
    }

}
Beispiel #5
0
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;
	}
}
Beispiel #6
0
//信息输出
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);
            }
        }
    }
}
Beispiel #7
0
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;
    }
}
Beispiel #8
0
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;
}