实现效果

这是系统提供的

这是自己实现的

实现思路

主要是目录项的读取文件详细信息的获取以及文件类型的判断

打开目录opendir->读取目录readdir->展示文件名->判断是否是普通文件还是目录文件是目录文件保存目录文件路径->递归遍历目录文件

这里主要用到函数原型是 opendir,closedir,readdir,lstat函数。还有就是文件类型的判断,自己封装简单封装了个文件类型的获取的stat_info.c。这里保存目录文件名个数是有限的,大家可以使用链表或者动态数组改进,简单实现嘛,就不弄那么复杂了。

实现代码

ls_R.c

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <dirent.h>
#include <error.h>
#include <stdlib.h>
#include <sys/stat.h>
#include "stat_info.h"void ListDir(char* path)
{DIR* root;int ret,i,j;char c;struct dirent* dir;struct stat info;char dirList[100][256];root = opendir(path);if(root == NULL){perror("opendir error");exit(1);}//展示根目录printf("%s:\n",path);i = 0;while( (dir=readdir(root))!=NULL ){if(dir->d_name[0]=='.'){continue;}char temp[256];char last = path[strlen(path)-1];if(last == '/'){sprintf(temp,"%s%s",path,dir->d_name);}else{sprintf(temp,"%s/%s",path,dir->d_name);}//printf("%s\n",temp);ret = lstat(temp,&info);if(ret < 0){perror("lstat error");exit(0);}c = GetFileTypeCh(info.st_mode);//printf("name:%20s,type:%c,size:%ld\n",dir->d_name,c,info.st_size) ;printf("%s\t",dir->d_name) ;//路径为 目录,进行递归遍历if(c == 'd'){strcpy(dirList[i++],temp);  if( i > 100 ){i--;break;}}}closedir(root);printf("\n\n");//递归展示目录下的目录项for(j = 0; j < i; j++){ListDir(dirList[j]);}return;
}
int main(int argc,char* argv[])
{if(argc < 2){printf("error:缺少参数\n");exit(1);}ListDir(argv[1]);return 0;
}

stat_info.h

#pragma once
#ifndef __STATINFO_H__
#define __STATINFO_H__
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <error.h>
#include <sys/errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>char GetFileTypeCh(mode_t mode);char* GetFileTypeStr(mode_t mode);int GetFileTypeInt(mode_t mode);#endif

stat_info.c

#include "stat_info.h" char GetFileTypeCh(mode_t mode)
{char c;switch (mode & S_IFMT) {case S_IFBLK: c = 'b';        break;case S_IFCHR: c = 'c';        break;case S_IFDIR: c = 'd';        break;case S_IFIFO: c = 'p';        break;case S_IFLNK: c = 'l';        break;case S_IFREG: c = '-';        break;case S_IFSOCK: c = 's';       break;default: c = 'u';             break;}return c;
}
char* GetFileTypeStr(mode_t mode)
{char* fileType = (char*)malloc(sizeof(char)*100);bzero(fileType,100);switch (mode & S_IFMT) {case S_IFBLK: strcpy(fileType,"block device");            break;case S_IFCHR: strcpy(fileType,"character device");        break;case S_IFDIR: strcpy(fileType,"directory");               break;case S_IFIFO: strcpy(fileType,"FIFO/pipe");               break;case S_IFLNK: strcpy(fileType,"symlink");                 break;case S_IFREG: strcpy(fileType,"regular file");            break;case S_IFSOCK: strcpy(fileType,"socket");                  break;default:       strcpy(fileType,"unknown?");                break;}return fileType;
}
int GetFileTypeInt(mode_t mode)
{if(S_ISREG(mode)){return S_IFREG; }if(S_ISDIR(mode)){return S_IFDIR; }if(S_ISCHR(mode)){return S_IFCHR;}if(S_ISBLK(mode)){return S_IFBLK; }if(S_ISFIFO(mode)){return S_IFIFO; }if(S_ISLNK(mode)){return S_IFLNK; }if(S_ISSOCK(mode)){return S_IFSOCK; }return -1;
}
//int main(int argc,char* argv[])
//{
//    struct stat file_info;
//    //使用lseek 查看文件大小
//    int ret = stat(argv[1],&file_info);
//    if(ret < 0)
//    {
//        perror("stat error");
//        exit(1);
//    }
//    printf("stat -> %s size :%ld,fileType:%s\n",argv[1],file_info.st_size,GetFileTypeStr(file_info.st_mode));
//    return 0;
//}

Linux系统编程:简单实现ls -R 功能相关推荐

  1. linux系统简单操作代码,Linux系统编程:简单文件IO操作(示例代码)

    使用Linux的文件API,经常看见一个东西,叫做文件描述符. 什么是文件描述符? (1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在 ...

  2. linux原子过程,linux系统编程:IO读写过程的原子性操作实验

    所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...

  3. 【学习笔记】Linux 系统编程入门

    Linux 系统编程入门 静态库与动态库 静态库命名规则 静态库的制作 静态库使用 动态库制作 动态库使用 加载动态库 静态库的优缺点 动态库的优缺点 Makefile 文件命名 工作原理 变量 模式 ...

  4. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  5. Linux系统编程总结

    day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...

  6. Linux系统编程-基本命令

    Linux系统编程-基本命令 目录 1.学习目标 2.Linux/Unix操作系统简介 2.1 Linux操作系统的目标(了解) 2.2 Linux操作系统的作用(了解) 2.3 Unix家族 (了解 ...

  7. 【Linux】Linux系统编程(入门与系统编程)(一)(环境搭建、常见指令以及权限理解)

    目录 linux系统编程 : 1.推动技术进步的基本模式 2.理解操作系统的发展 Linux 背景介绍 UNIX发展的历史: Linux发展历史 开源 Linux的发行版本: a.技术角度 b.商业化 ...

  8. alin的学习之路(Linux系统编程:一)(Linux基础命令)

    alin的学习之路(Linux系统编程:一)(Linux基础命令) 1.Linux学习准备 操作系统的作用 向上给用户提供简单的操作计算机硬件的方式 对下管理硬件 承上启下 程序运行在操作系统上,程序 ...

  9. Linux系统编程——进程

    一.进程概念 基础 程序:死的.只占用磁盘空间. --剧本 进程:活的.运行起来的程序.占用内存,cpu等系统资源. --戏 并发 并发的出现基于CPU的发展.然后有了多道程序设计(多进程并发执行). ...

最新文章

  1. 华为10GE LAN板与Wan板区别
  2. matlab生成实指数序列、matlab茎状图
  3. php流调签名,微信接口签名及调用流程详解 - 黎明互联-官方博客 - 黎明互联 - 区块链培训,PHP培训,IT培训,职业技能培训,追求极致!改变您的职业生涯!...
  4. 【SIP协议】学习初学笔记
  5. iOS开发点击UIButton实现UIView的旋转
  6. andriod的apk文件相关的编译反编译工具
  7. 韩国造智能手机时代走向终结:昔日巨头纷纷关闭生产线或削减产量
  8. 色彩艺术海报PSD模板 | 用色彩挑动你的情趣
  9. CBR VBR ABR
  10. 域名解析不生效,中科三方带你定位!
  11. linux ln命令详解
  12. Android Studio一直Indexing
  13. firefox+android+平板,Mozilla展示Android平板火狐浏览器设计细节
  14. xp访问win10计算机名,xp连接win10共享打印机提示凭证不足怎么办
  15. pandas中的dropna()方法解析
  16. 844.比较含退格的字符串
  17. linux命令名字由来--整理
  18. Python NLP自然语言处理详解
  19. DAC配置—SPI的使用
  20. 用计算机探索规律1 根号2,§2.5 用计算器开方

热门文章

  1. 1.6编程基础之一维数组_01与指定数字相同的数的个数
  2. awk 匹配_linux的awk命令详解,通俗易懂
  3. OMNeT学习之OMNeT安装与运行
  4. python pca降维_机器学习之sklearn中的降维算法
  5. Spring Boot笔记-@PathVariable的使用
  6. C++工作笔记-使用namespace构建常量头文件
  7. Spring Boot笔记-发送消息给RabbitMQ
  8. QML笔记-4中方式运行qml文件
  9. Qt官方文档阅读笔记-QStyledItemDelegate Class描述
  10. Java高级语法笔记-HashMap