您的位置:首页 > 运维架构 > Linux

模仿linux命令ls

2013-11-20 10:37 316 查看
最近学linux下C编程,学到文件方面,编写了一个模仿命令ls的C语言程序,先贴代码

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<dirent.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
void printmode(mode_t modes)
{
	int i=0;
	char descrip[11];
	static short octarray[9]={0400,0200,0100,0040,0020,0010,0004,0002,0001};
	static char perms[10]="rwxrwxrwx";
	if(S_ISREG(modes)) descrip[0]='-';  //Add file type
	else if(S_ISDIR(modes)) descrip[0]='d';
	else 
	{
		printf("\nUnknown mode\n");
		return;
	}
	for(i=1;i<10;i++)
	{
		if(modes&octarray[i-1])
			descrip[i]=perms[i-1];
		else
			descrip[i]='-';
	}
	for(i=0;i<10;i++)
	{
		printf("%c",descrip[i]);
	}
	printf(" ");
}
void printdir(char path[])
{
	DIR *dir;
	struct dirent *entry;
	struct stat statbuff;
	mode_t modes;
	printf("The working directory is %s \n",path);
	if((dir=opendir(path)) == NULL)
	{
		fprintf(stderr,"Can not open directory: %s\n",path);
		return;
	}
	chdir(path);
	while((entry=readdir(dir))!=NULL)
	{
		lstat(entry->d_name,&statbuff);
		modes=statbuff.st_mode;
		if(S_ISDIR(modes))
		{
			if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
			{
				continue;
			}
			printmode(modes);		
			printf("%s/\n",entry->d_name);
			continue;
		}
		printmode(modes);
		printf("%s\n",entry->d_name);
	}
	closedir(dir);
	
}
int main()
{
	char buffer[40]="";
	getcwd(buffer,sizeof(buffer));
	printdir(buffer);
	return 0;
}
目前实现功能就是列出当前工作目录的文件列表,省略目录".'和"..",还有列出文件属性。

权限掩码我用个数组存储,里面存储的是八进制

static short octarray[9]={0400,0200,0100,0040,0020,0010,0004,0002,0001};


然后在用位与运算判断是否有个这权限

for(i=1;i<10;i++)
	{
		if(modes&octarray[i-1])
			descrip[i]=perms[i-1];
		else
			descrip[i]='-';
	}


至于权限存储是在struct stat结构中st_mode的0-8位,具体我引用了别人的文章http://blog.chinaunix.net/uid-25100840-id-1762681.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: