c语言实现ls -l的功能.doc_第1页
c语言实现ls -l的功能.doc_第2页
c语言实现ls -l的功能.doc_第3页
c语言实现ls -l的功能.doc_第4页
c语言实现ls -l的功能.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux下C语言实现ls -l功能 需求:用ls -l显示文件夹下所有的文件及属性 分析:1 用ls显示文件夹下的所有文件,首先用opendir打开文件夹,再用readdir读取文件夹里面的文件,最后closedir关闭文件夹。 2 用ls -l比较复杂,打印出来的内容包括:(文件属性+文件名) 由以下几部分构成文件的类型(d目录文件 -文本文件.)文件的可执行权限 所属组的权限,其它组的权限 硬链接数 文件拥有者 文件拥有者组 文件大小 时间 文件名 解决方案: 1. 要想实现ls -l就得知道通过什么系统调用获取文件信息,首先自然是要通过man来查找相关的系统调用。man -k file|grep statusman -k file|grep informationman -k file|grep info通过上面的搜索就可以得到stat这个系统调用获取文件属性。man 2 stat获取系统调用的详细使用方法: #include #include #include struct stat dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size, in bytes */ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last status change */ ;只要通过相应字段进行格式处理就行啦!2.权限处理:st_mode就是文件的权限部分。St_mode本身就是一个16位的二进制,前四位是文件的类型,紧接着三位是特殊权限,左后九位就是ls -l列出来的九个权限。 linux本身提供了很多测试宏来测试文件的类型的#define _S_IFMT 0170000 /* These bits determine file type. */* File types. */#define _S_IFDIR 0040000 /* Directory. */#define _S_IFCHR 0020000 /* Character device. */#define _S_IFBLK 0060000 /* Block device. */#define _S_IFREG 0100000 /* Regular file. */#define _S_IFIFO 0010000 /* FIFO. */#define _S_IFLNK 0120000 /* Symbolic link. */#define _S_IFSOCK 0140000 /* Socket. */利用上面的测试宏就可以判断文件的类型,至于文件的权限部分可以使用掩码的方式来处理。具体代码如下:vim file_mode.c#include list.h/man 2 stat可看到文件基本属性void file_mode(struct stat* buf)int i;char buff10 = -;switch(buf-st_mode & S_IFMT)/按位&获取文件基本属性case S_IFIFO:buff0 = f;break;case S_IFDIR:buff0 = d;break;case S_IFSOCK:buff0 = s;break;case S_IFBLK:buff0 = b;break;case S_IFLNK:buff0 = l;break;if(buf-st_mode & S_IRUSR ) buff1 = r; if(buf-st_mode & S_IWUSR ) buff2 = w; if(buf-st_mode & S_IXUSR ) buff3 = x; if(buf-st_mode & S_IRGRP ) buff4 = r; if(buf-st_mode & S_IWGRP ) buff5 = w; if(buf-st_mode & S_IXGRP ) buff6 = x; if(buf-st_mode & S_IROTH ) buff7 = r; if(buf-st_mode & S_IWOTH ) buff8 = w; if(buf-st_mode & S_IXOTH ) buff9 = x; for(i=0;i pw_name,str - gr_name);/打印文件所有者和文件所有者组5. 完整代码展示:list.h头文件:#ifndef LIST_H#define LIST_H#include #include #include #include #include #include #include #include #include #include #include void file_mode(struct stat* buf);void file_gid_uid(int uid,int gid);void file_operation(char* argv);#endiflist.c主框架:#include list.hint main(int argc,char* argv)if(argc = 1)argv1 = ./;file_operation(argv);return 0; file_mode.c文件属性: #include list.h/man 2 stat可看到文件基本属性void file_mode(struct stat* buf)int i;char buff10 = -;switch(buf-st_mode & S_IFMT)/按位&获取文件基本属性case S_IFIFO:buff0 = f;break;case S_IFDIR:buff0 = d;break;case S_IFSOCK:buff0 = s;break;case S_IFBLK:buff0 = b;break;case S_IFLNK:buff0 = l;break;if(buf-st_mode & S_IRUSR ) buff1 = r; if(buf-st_mode & S_IWUSR ) buff2 = w; if(buf-st_mode & S_IXUSR ) buff3 = x; if(buf-st_mode & S_IRGRP ) buff4 = r; if(buf-st_mode & S_IWGRP ) buff5 = w; if(buf-st_mode & S_IXGRP ) buff6 = x; if(buf-st_mode & S_IROTH ) buff7 = r; if(buf-st_mode & S_IWOTH ) buff8 = w; if(buf-st_mode & S_IXOTH ) buff9 = x; for(i=0;i pw_name,str - gr_name);/打印文件所有者和文件所有者组file_operation.c:#include list.hvoid file_operation(char* argv)DIR* fd; /定义文件夹类型struct dirent* fp;/fp文件夹返回值struct stat buf;int ret;/获取文件属性char temp100; /中间变量存放文件路径if(fd = opendir(argv1) = NULL)/打开文件夹perror(open file fail!);exit(0);while(fp = readdir(fd) != NULL)/循环读取文件夹中的文件信息strcpy(temp,argv1);/将路径付给中间变量tempstrcat(temp,fp - d_name);/把文件名字添加到路径后面形成完整的路径if(ret = stat(temp,&buf) = -1)/获取文件基本属性perror(stat);exit(0);file_mode(&buf);/文件属性(目录,链接,可读,可写,可执行)printf( %d,buf.st_nlink);/打印链接数file_gid_uid(buf.st_uid,buf.st_gid);/调用函数打印出文件拥有者和文件所有者组printf(t%ld,buf.st_size);/打印文件大小/Time();/获取时间printf(t%.12s ,4 + ctime(&buf.st_mtime);printf( %sn,fp - d_name);/打印文件名closedir(fd);makefile:# 生成可执行文件和动态链接库的makefile#source file#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件SOURCE := $(wildcard *.c) $(wildcard *.cpp)OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE) #target you can change test to what you want#目标文件名,输入任意你想要的执行文件名TARGET := appTARGET_2 := libtest.so #compile and lib parameter#编译参数CC := gccLIBS :=LDFLAGS :=DEFINES :=INCLUDE := -I.CFLAGS := -g $(DEFINES) $(INCLUDE)#-Wall -O3 -DDEBUGCXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_HSHARE := -fPIC -shared -o #i think you should do anything here#下面的基本上不需要做任何改动了.PHONY : everything objs clean veryclean rebuild everything : $(TARGET) $(TARGET_2) all : $(TARGET) $(TARGET_2) objs : $(OBJS) rebuild: veryclean everything clean :#rm -fr *.sorm -fr *.orm -fr index_head.dat index_head.txt index_content.txt index_content.dat draw_word.txt veryclean : cleanrm -fr $(TARGET) rm -fr $(TA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论