ls

输出一个文件名的列表,它是这样工作的

open directory;
while(!(end of dir))
{read file info;
}
open directory


看一下结果:

难点还是main函数的参数变化,就是我们只输入./myls1 着就相当于main获得一个参数,也就是argc=1,*argv=“./myls1 ”

当你输入

 ./myls1  ../ls  ../camke-build-debug

此时:

argc=3;
*argv=“./myls1 ”;
*(argv+1) = “ ../ls ”;
*(argv+2) = “  ../camke-build-debug”;

再说一下readdir函数的特点,接受一个Dir *参数,返回一个dirent *

有个循环:

while((pdirent=readdir(pDir)) != NULL)
{if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0){continue;}printf("%sn", pdirent->d_name);}

一般我们比如写while(i>0),循环体里面肯定会有i--之类的

容易发现循环条件是(pdirent=readdir(pDir)) != NULL,在循环体内找不到关于dirent的代码,其实readdir(pDir)的返回值每次都不一样,它会返回目录下的所有文件结构体直到返回NULL

opendir(const char *pathname)函数 接受一个路径,打开这个路径下的目录,成功则返回DIR*型态的目录,失败则返回NULL


opendir只能打开目录路径,如果时./mian.c这种单个文件是打不开的(这是不是表明Dir只能表示目录)

综上,我们想获取一个目录下所有文件名(包括目录,目录也是文件)需要以下几步:

  • 调用opendir函数并传入目录所在路径char *类型(此时应该判断是不是打开成功)
  • 循环调用readdir函数并传入opendir返回的Dir *指针,用dirent *指针接收其返回值,直到readdir返回NULL
  • 通过dirent *指针的d_name属性获取文件名或者其他信息
  • 最后关闭closedir(pDir);

源码:

#include<stdio.h>
#include<string.h>
#include<dirent.h>void ls(char *dirpath);int main(int argc, char *argv[])
{if(argc==1)//没有命令行参数时,列出当前目录中的文件和目录列表{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);}
}


函数stat的作用是获取文件路径为file_path的文件的详细信息,存储在stat结构体中,file_path既可以是文件路径也可以是目录路径

int stat(const char *file_path, struct stat *buf);
执行成功则返回0,失败返回-1,错误代码存于errno
错误代码:
ENOENT         参数file_name指定的文件不存在
ENOTDIR        路径中的目录存在但却非真正的目
ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT         参数buf为无效指针,指向无法存在的内存空间
EACCESS        存取文件时被拒绝
ENOMEM         核心内存不足
ENAMETOOLONG   参数file_name的路径名称太长数值

常用:

    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);}}

ubantu实现linux命令的实验_C语言实现linux命令---ls相关推荐

  1. 实验一 linux命令使用,实验一XXXXX常用linux命令的使用(一)

    以下为<实验一XXXXX常用linux命令的使用(一)>的无排版文字预览,完整格式请下载 下载前请仔细阅读文字预览以及下方图片预览.图片预览是什么样的,下载的文档就是什么样的. 实验一 常 ...

  2. c语言程序命令行,ttyd(C语言编写的命令行程序) v1.3.1 免费版

    ttyd是一个C语言编写的命令行程序,可以把任意命令行程序分享到网页上操作,可以看做是个网页版的远程终端,支持 Linux.macOS 系统,还可以运行在 OpenWrt 之类的嵌入式系统上. 功能特 ...

  3. xshell命令大全编译c语言,Xshell常用命令大全

    suse linux 常用命令 (1)命令ls--列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的"隐藏"文件 ls a* 列出当前目录下以字母a开头的 ...

  4. micropython编译原理_C语言嵌入式Linux高级编程第9期:CPU和操作系统入门视频课程...

    嵌入式开发是一门交叉学科. 它要求我们的嵌入式工程师,不仅学习C语言.汇编.软件工程等软件层面的知识技能,还要求对CPU内部工作机制.计算机系统架构.操作系统原理.编译器等都有一个全局的认识和把握. ...

  5. c语言tty,1. 终端_C语言_C语言入门-Linux C编程一站式学习

    1.2. 终端登录过程 一台PC通常只有一套键盘和显示器,也就是只有一套终端设备,但是可以通过Ctrl-Alt-F1~Ctrl-Alt-F6切换到6个字符终端,相当于有6套虚拟的终端设备,它们共用同一 ...

  6. linux下如何用c语言调用shell命令-转

    C程序调用shell脚本共有三种法子 :system().popen().exec系列函数 system()不用你自己去产生进程,它已经封装了,直接加入自己的命令exec 需要你自己 fork 进程, ...

  7. 位运算 c语言 头文件 linux,1. 位运算_C语言_C语言入门-Linux C编程一站式学习...

    1.2. 移位运算 移位运算符(Bitwise Shift)包括左移<>.左移将一个整数的各二进制位全部左移若干位,例如0xcfffffff3<<2得到0x3fffffcc: ...

  8. linux 析构函数地址获取_c语言中有析构函数吗

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. 嵌入式linux系统蜂鸣器实验,「正点原子Linux连载」第四十六章Linux蜂鸣器实验

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 大家将imx35_gpio_hwdata ...

最新文章

  1. 介绍两个非常好用的Javascript内存泄漏检测工具
  2. 全球首个「活体机器人」生娃!100%青蛙基因,杀不死,可繁衍4世
  3. 日周月筛选器_天谕2.09月3日周版本更新维护内容预告
  4. MYSQL 设计数据结构注意事项
  5. linux黄金命令[积累中]
  6. python将数字转为0010_用Python将HTML转为PDF。
  7. regedit start mysql_MySQL安装完成配置的时候start service报错
  8. 11个高效的VS调试技巧
  9. 波音正在对737 Max进行软件升级 改善飞行员培训计划
  10. fmea软件_新版FMEA易错点梳理(一):范围界定和过程流程图-SGS
  11. Linux TCP 性能調優筆記
  12. Total Commander 使用技巧
  13. 由《炮灰模型——女生选择追求者模型》到“微软钻石题”
  14. 离线式echarts模拟百度迁徙的实现
  15. windows vcpkg下载慢
  16. Excel---饼图美化与ppt图表
  17. 如何给Word参考文献加方括号
  18. epoch如何设置,在Keras中,steps_per_epoch和纪元的设置如何影响训练结果?
  19. A - Faulty Odometer
  20. 五笔打字怎么学,负基础

热门文章

  1. 第07课:动手实战基于 ML 的中文短文本聚类
  2. 模型融合(stackingblending)
  3. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型
  4. Tensorflow从入门到精通之:Tensorflow基本操作
  5. BTrace使用小结
  6. 大量DelegatingClassLoader类加载器,导致Perm区溢出
  7. 被动模式下FTP不能建立数据会话问题
  8. 构建简单spring boot 项目
  9. objective-c 逐帧动画
  10. Linux主流架构运维工作简单剖析