使用linux-c編程實現簡單的ls命令
阿新 • • 發佈:2017-05-28
使用c實現ls命令 */
使用Linux—c編程實現簡單的ls命令
具體代碼如下:
加載的頭文件有stdio.h,sys/types.h,dirent.h,unistd.h,sys/stat.h,fcntl.h,string.h等。
void main(int argc,char **argv){ DIR *dir; struct dirent *rdir; struct stat statbuf; char * buffer=”/”; char *file_; char *p; int lenght=strlen(argv[argc-1]); int len=argc; char parameter[]={‘i’,’t’,’a’,’u’,’g’,’b’,’s’}; //參數屬組 if(argc==1 ||strstr(argv[argc-1],buffer)==NULL){ argv[argc++]=”./”; dir=opendir(“./”); //打開目錄文件 }else{ dir=opendir(argv[argc-1]); file_=argv[argc-1]; //打開目錄文件 } while((rdir=readdir(dir))!=NULL){ //讀取目錄中的目錄或者文件 if(len!=argc){ file_=rdir->d_name; //從struct dirent結構取出文件名稱 }else{ p=rindex(file_,’/’); if(strlen(p)!=1){ strcat(file_,buffer); } strcat(file_,rdir->d_name); } int file=open(file_,O_RDONLY,0); //打開文件 stat(file_,&statbuf); //通過stat函數讀取文件的狀態信息放在struct stat 這個結構體中,這個結構包含文件的屬組,屬主,權限,時間戳,文件大小等。 int tmp=1; while(tmp<argc){ if(rindex(argv[tmp],parameter[0])!=NULL){ printf("%10d",rdir->d_ino); } if(rindex(argv[tmp],parameter[1])!=NULL){ printf("%10d",statbuf.st_atime); } if(rindex(argv[tmp],parameter[2])!=NULL){ printf("%10d",rdir->d_ino); printf("%20d",statbuf.st_atime); printf("%10d",statbuf.st_uid); printf("%10d",statbuf.st_gid); printf("%10d",statbuf.st_blocks); printf("%10d",statbuf.st_size); } if(rindex(argv[tmp],parameter[3])!=NULL){ printf("%10d",statbuf.st_uid); } if(rindex(argv[tmp],parameter[4])!=NULL){ printf("%10d",statbuf.st_gid); } if(rindex(argv[tmp],parameter[5])!=NULL){ printf("%10d",statbuf.st_blocks); } if(rindex(argv[tmp],parameter[6])!=NULL){ printf("%10d",statbuf.st_size); } tmp++; } close(file); //關閉打開的文件 if(len!=argc){ int j=strlen(file_); while(j>=lenght){ file_[j--]=NULL; } } printf("%20s\n",rdir->d_name); } closedir(dir); //關閉打開的目錄 }
/*
struct stat { mode_t st_mode; //文件對應的模式,文件,目錄等 ino_t st_ino; //inode節點號 dev_t st_dev; //設備號碼 dev_t st_rdev; //特殊設備號碼 nlink_t st_nlink; //文件的連接數 uid_t st_uid; //文件所有者 gid_t st_gid; //文件所有者對應的組 off_t st_size; //普通文件,對應的文件字節數 time_t st_atime; //文件最後被訪問的時間 time_t st_mtime; //文件內容最後被修改的時間 time_t st_ctime; //文件狀態改變時間 blksize_t st_blksize; //文件內容對應的塊大小 blkcnt_t st_blocks; //偉建內容對應的塊數量 };
struct drient { long d_ino; 索引節點號 off_t d_off; 在目錄文件中的偏移 unsigned short d_reclen; 文件名長 unsigned char d_type; 文件類型 char d_name [NAME_MAX+1]; 文件名,最長255字符 } int stat(const char *path, struct stat *struct_stat); int lstat(const char *path,struct stat *struct_stat); 還有一個fstat函數。
兩個函數的第一個參數都是文件的路徑,第二個參數是struct stat的指針。返回值為0,表示成功執行。
本文出自 “lnsaneLlinux” 博客,請務必保留此出處http://lnsane784.blog.51cto.com/1226518/1930437
使用linux-c編程實現簡單的ls命令