学习贵在坚持,兜兜转转,发现还是从基础做起吧,打好基础,才会长期的坚持下去。。。

  第一个练习:shell命令 “ls"的实现与递归

  1、简介:ls 的作用是列举当前目录下所有的目录和文件。

  2、用到的结构体——struct dirent;

 struct dirent
{
  long d_ino; /* inode number 索引节点号 */   
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */   
unsigned short d_reclen; /* length of this d_name 文件名长 */   
unsigned char d_type; /* the type of d_name 文件类型 */   
char d_name [NAME_MAX+]; /* file name (null-terminated) 文件名,最长255字符 */
}

  struct dirent 结构体中成员d_type文件类型的分类:

 enum
{
DT_UNKNOWN = , //类型未知。少数文件系统会出现此函数不支持的文件类型,另一些则总是返回这个值。译者注:总之这个值是为了应对不兼容的文件系统而设置的;
# define DT_UNKNOWN DT_UNKNOWN
DT_FIFO = , // 一个命名管道,或FIFO
# define DT_FIFO DT_FIFO
DT_CHR = , // 字符设备
# define DT_CHR DT_CHR
DT_DIR = , // 目录
# define DT_DIR DT_DIR
DT_BLK = , // 块设备
# define DT_BLK DT_BLK
DT_REG = , // 常规文件
# define DT_REG DT_REG
DT_LNK = , // 符号链接
# define DT_LNK DT_LNK
DT_SOCK = , // 套接字
# define DT_SOCK DT_SOCK
DT_WHT =
# define DT_WHT DT_WHT
};

  3、目录文件的操作函数——opendir、readdir、closedir;

opendir(打开目录)

 
相关函数
open,readdir,closedir,rewinddir,seekdir,telldir,scandir
表头文件
#include<sys/types.h>
#include<dirent.h>
定义函数
DIR * opendir(const char * name);
函数说明
opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。
返回值
成功则返回DIR* 型态的目录流,打开失败则返回NULL。
错误代码
EACCESS 权限不足
EMFILE 已达到进程可同时打开的文件数上限。
ENFILE 已达到系统可同时打开的文件数上限。
ENOTDIR 参数name非真正的目录
ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符串。
ENOMEM 核心内存不足。

readdir(读取目录)

相关函数
open,opendir,closedir,rewinddir,seekdir,telldir,scandir
表头文件
#include<sys/types.h>
#include<dirent.h>
定义函数
struct dirent * readdir(DIR * dir);
函数说明
readdir()返回参数dir目录流的下个目录进入点。
结构dirent定义如下
struct dirent
{
ino_t d_ino;
ff_t d_off;
signed short int d_reclen;
unsigned char d_type;
har d_name[256;
};
d_ino 此目录进入点的inode
d_off 目录文件开头至此目录进入点的位移
d_reclen _name的长度,不包含NULL字符
d_type d_name 所指的文件类型
d_name 文件名
返回值
成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。
附加说明
EBADF参数dir为无效的目录流。

closedir(关闭目录)

 
相关函数
opendir
表头文件
#include<sys/types.h>
#include<dirent.h>
定义函数
int closedir(DIR *dir);
函数说明
closedir()关闭参数dir所指的目录流。
返回值
关闭成功则返回0,失败返回-1,错误原因存于errno 中。
错误代码
EBADF 参数dir为无效的目录流
范例
参考readir()。

  4、代码示例:

 #include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <errno.h> #if 0
struct dirent
{
  long d_ino; /* inode number 索引节点号 */   
off_t d_off; /* offset to this dirent 在目录文件中的偏移 */   
unsigned short d_reclen; /* length of this d_name 文件名长 */   
unsigned char d_type; /* the type of d_name 文件类型 */   
char d_name [NAME_MAX+]; /* file name (null-terminated) 文件名,最长255字符 */
} // d_type表示档案类型: enum
{
DT_UNKNOWN = , //类型未知。少数文件系统会出现此函数不支持的文件类型,另一些则总是返回这个值。译者注:总之这个值是为了应对不兼容的文件系统而设置的;
# define DT_UNKNOWN DT_UNKNOWN
DT_FIFO = , // 一个命名管道,或FIFO
# define DT_FIFO DT_FIFO
DT_CHR = , // 字符设备
# define DT_CHR DT_CHR
DT_DIR = , // 目录
# define DT_DIR DT_DIR
DT_BLK = , // 块设备
# define DT_BLK DT_BLK
DT_REG = , // 常规文件
# define DT_REG DT_REG
DT_LNK = , // 符号链接
# define DT_LNK DT_LNK
DT_SOCK = , // 套接字
# define DT_SOCK DT_SOCK
DT_WHT =
# define DT_WHT DT_WHT
}; #endif void listDir(char *dir)
{
DIR *dp;
struct dirent *dirp;
char childpath[]; memset(childpath,,sizeof(childpath));
if ((dp = opendir(dir)) == NULL)
{
printf("can't open the directory %s,Error = %s!\n",dir,strerror(errno));
return;
} while ((dirp = readdir(dp)) != NULL)
{
// printf("dir = %s,dir_type = %d,DT_DIR = %d\n",dirp->d_name,dirp->d_type,DT_DIR);
if (dirp->d_type == DT_DIR)
{
if (strcmp(dirp->d_name,".") == || strcmp(dirp->d_name,"..") == )
continue;
sprintf(childpath,"%s/%s",dir,dirp->d_name);
printf("childpath = %s\n",childpath);
listDir(childpath);
}
else
{
printf("filename = %s\n",dirp->d_name);
}
}
closedir(dp);
} int main(int argc,char *argv[])
{
if (argc != )
{
printf("Usage: ls directory name!\n");
return -;
}
listDir(argv[]);
return ;
}

基础练习1——ls的实现与递归的更多相关文章

  1. JAVA基础知识(2)--堆栈和递归的操作

    2015-07-26 18:16:21/***该应用程序对堆栈和递归方法进行实例操作: *1.堆栈操作:先进后出,*2.递归方法:直接或者调用自己的方法:*@author lhm *Email:912 ...

  2. Python基础_函数闭包、调用、递归

    这节的主要内容是函数的几个用法闭包,调用.递归. 一.函数闭包 对闭包更好的理解请看:https://www.cnblogs.com/Lin-Yi/p/7305364.html 我们来看一个简单的例子 ...

  3. Python函数基础-函数调用,定义,参数,递归

    Python内置了很多函数供调用,eg 求绝对值函数abs() >>>abs(-1) 1 >>>abs(1) 求和函数sum(),sum(iterable,star ...

  4. java复习小知识(基础不算,有反射,递归)

    顺序选择循环,三种 1.至于循环和递归 循环效率更高,但是递归在处理文件递归的时候更为常见快捷 在java中实现传多参 2.public static void main(String[]  args ...

  5. 020--python函数基础知识考试(包括:函数_递归等知识)

    1.列举布尔值为 False 的值 空,None,0, False, '', [], {}, () 2.写函数: 根据范围获取其中 3 和 7 整除的所有数的和,并返回调用者:符合条件的数字个数以及符 ...

  6. 零基础入门学习Python(24)--递归:汉诺塔

    知识点 这节课主要讲解用递归的方法,实现汉诺塔的解答 对于游戏的玩法,我们可以简单分解为三个步骤: 1) 将前63个盘子从X移动到Y上. 2) 将最底下的第64个盘子从X移动到Z上. 3) 将Y上的6 ...

  7. 零基础入门学习Python(23)--递归:这帮小兔崽子

    知识点 我们都知道兔子繁殖能力是惊人的,如下图: 我们可以用数学函数来定义: 假设我们需要求出经历了20个月后,总共有多少对小兔崽子? 迭代实现 def fab(n): n1 = 1 n2 = 1 n ...

  8. JAVA 基础编程练习题22 【程序 22 递归求阶乘】

    22 [程序 22 递归求阶乘] 题目:利用递归方法求 5!. 程序分析:递归公式:fn=fn_1*4! package cskaoyan; public class cskaoyan22 { @or ...

  9. linux中的一些基础命令的使用(which,whereis,locate,find,alias,file,ls,cat,echo,tar,bzip2,gzip,history,mv,cp,rm)

    which whereis locate find alias file ls cat echotar bzip2 gzip history mv cp rm -------------------- ...

随机推荐

  1. 记一次linux Docker网络故障排除经历

    背景: 之前做了一个项目,需要在容器内访问宿主机提供的Redis 服务(这是一个比较常见的应用场景哈), 常规方案: ①   主机网络(docker run --network=host): 完全应用 ...

  2. vultr恢复快照后更改密码(CentOs7)

    vultr恢复快照之后发现Xshell连不上了,仔细想想应该是之前换服务器的时候恢复快照导致密码更改了, 但是我已经把之前的服务器删了,没记住密码,这就很难受 只好改密码了 首先去官网 打开终端: 最 ...

  3. Flume 学习笔记之 Flume NG概述及单节点安装

    Flume NG概述: Flume NG是一个分布式,高可用,可靠的系统,它能将不同的海量数据收集,移动并存储到一个数据存储系统中.轻量,配置简单,适用于各种日志收集,并支持 Failover和负载均 ...

  4. PHP的bcmath编译安装

    问题描述:zabbix编译安装时PHP条件检查失败,如下图: 解决办法: 1.PHP自带bcmath扩展模块,可直接进行编译安装. [root@localhost etc]# cd /usr/loca ...

  5. Word文档操作知识

    Word文档操作知识 #持续更新 本次更新时间:2019-03-06 14:34 一.换行时字体空间过大 问题情景:当我们编写中文的文档时,中间插入了西方的字体或符号,在以它为行尾换行时: 会出现字体 ...

  6. 1.Eclipse下载、常用配置、快捷键

    Eclipse官网下载:https://www.eclipse.org/downloads/packages/ 自动补全 位置:Eclipse——Window——Perferences——Java—— ...

  7. 基于Linux的kfifo移植到STM32(支持os的互斥访问)

    基于Linux的kfifo移植到STM32(支持os的互斥访问) 关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现:它提供一个 ...

  8. LeetCode_20-Valid Parentheses

    给定一个字符串,其中包含字符’(’,’)’,’[’,’]’,’{‘,’}’,左括号必须匹配右括号,一对匹配的括号不能单独出现单个左括号或者右括号.如:(()[])有效,[(])无效空字符串也算是有效的 ...

  9. 致远OA_0day批量植Cknife马一步到位

    最近各位师傅都在刷这个嘛,原本的exp是上传一个test123456.jsp的命令执行的马子,不过我在试的时候发现替换成C刀一句话出错,原因未知,并且test123456.jsp如果存在的话用原来ex ...

  10. Neo4j:图数据库GraphDB(二)高级查找

    接着上一篇,继续介绍图数据库Neo4j: http://www.cnblogs.com/rongyux/p/5537028.html 三 高级查找操作 1过滤   name = "Tom H ...