ubantu实现linux命令的实验_C语言实现linux命令---ls
輸出一個(gè)文件名的列表,它是這樣工作的
open directory; while(!(end of dir)) {read file info; } open directory看一下結(jié)果:
難點(diǎn)還是main函數(shù)的參數(shù)變化,就是我們只輸入./myls1 著就相當(dāng)于main獲得一個(gè)參數(shù),也就是argc=1,*argv=“./myls1 ”
當(dāng)你輸入
./myls1 ../ls ../camke-build-debug此時(shí):
argc=3; *argv=“./myls1 ”; *(argv+1) = “ ../ls ”; *(argv+2) = “ ../camke-build-debug”;再說(shuō)一下readdir函數(shù)的特點(diǎn),接受一個(gè)Dir *參數(shù),返回一個(gè)dirent *
有個(gè)循環(huán):
while((pdirent=readdir(pDir)) != NULL) {if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0){continue;}printf("%sn", pdirent->d_name);}一般我們比如寫(xiě)while(i>0),循環(huán)體里面肯定會(huì)有i--之類的
容易發(fā)現(xiàn)循環(huán)條件是(pdirent=readdir(pDir)) != NULL,在循環(huán)體內(nèi)找不到關(guān)于dirent的代碼,其實(shí)readdir(pDir)的返回值每次都不一樣,它會(huì)返回目錄下的所有文件結(jié)構(gòu)體直到返回NULL
opendir(const char *pathname)函數(shù) 接受一個(gè)路徑,打開(kāi)這個(gè)路徑下的目錄,成功則返回DIR*型態(tài)的目錄,失敗則返回NULL
opendir只能打開(kāi)目錄路徑,如果時(shí)./mian.c這種單個(gè)文件是打不開(kāi)的(這是不是表明Dir只能表示目錄)
綜上,我們想獲取一個(gè)目錄下所有文件名(包括目錄,目錄也是文件)需要以下幾步:
- 調(diào)用opendir函數(shù)并傳入目錄所在路徑char *類型(此時(shí)應(yīng)該判斷是不是打開(kāi)成功)
- 循環(huán)調(diào)用readdir函數(shù)并傳入opendir返回的Dir *指針,用dirent *指針接收其返回值,直到readdir返回NULL
- 通過(guò)dirent *指針的d_name屬性獲取文件名或者其他信息
- 最后關(guān)閉closedir(pDir);
源碼:
#include<stdio.h> #include<string.h> #include<dirent.h>void ls(char *dirpath);int main(int argc, char *argv[]) {if(argc==1)//沒(méi)有命令行參數(shù)時(shí),列出當(dāng)前目錄中的文件和目錄列表{ls(".");}else{while(--argc){printf("%s:n",*++argv);ls(*argv);}}return 0; }void ls(char *dirpath) {DIR *pDir;struct dirent *pdirent;if((pDir=opendir(dirpath)) == NULL){fprintf(stderr,"ls1:cannot open %sn",dirpath);}else{while((pdirent=readdir(pDir)) != NULL){if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0){continue;}printf("%sn", pdirent->d_name);}closedir(pDir);} }函數(shù)stat的作用是獲取文件路徑為file_path的文件的詳細(xì)信息,存儲(chǔ)在stat結(jié)構(gòu)體中,file_path既可以是文件路徑也可以是目錄路徑
int stat(const char *file_path, struct stat *buf); 執(zhí)行成功則返回0,失敗返回-1,錯(cuò)誤代碼存于errno 錯(cuò)誤代碼: ENOENT 參數(shù)file_name指定的文件不存在 ENOTDIR 路徑中的目錄存在但卻非真正的目 ELOOP 欲打開(kāi)的文件有過(guò)多符號(hào)連接問(wèn)題,上限為16符號(hào)連接 EFAULT 參數(shù)buf為無(wú)效指針,指向無(wú)法存在的內(nèi)存空間 EACCESS 存取文件時(shí)被拒絕 ENOMEM 核心內(nèi)存不足 ENAMETOOLONG 參數(shù)file_name的路徑名稱太長(zhǎng)數(shù)值常用:
if (argc==1){printf("Please Enter a path to at least one file");exit(-1);}else{while(--argc){if (0 != stat(*++argv, &file_stat)) //call stat function{perror("stat");exit(-1);}printf("%s:n",*argv);print_file_stat(&file_stat);}}總結(jié)
以上是生活随笔為你收集整理的ubantu实现linux命令的实验_C语言实现linux命令---ls的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 残值率怎么算 残值率的计算公式
- 下一篇: 家庭常见的14种理财方式有哪些?