Linux系统编程:简单实现ls -R 功能
实现效果
这是系统提供的
这是自己实现的
实现思路
主要是目录项的读取和文件详细信息的获取以及文件类型的判断。
打开目录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 功能相关推荐
- linux系统简单操作代码,Linux系统编程:简单文件IO操作(示例代码)
使用Linux的文件API,经常看见一个东西,叫做文件描述符. 什么是文件描述符? (1)文件描述符其实实质是一个数字,这个数字在一个进程中表示一个特定的含义,当我们open打开一个文件时,操作系统在 ...
- linux原子过程,linux系统编程:IO读写过程的原子性操作实验
所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...
- 【学习笔记】Linux 系统编程入门
Linux 系统编程入门 静态库与动态库 静态库命名规则 静态库的制作 静态库使用 动态库制作 动态库使用 加载动态库 静态库的优缺点 动态库的优缺点 Makefile 文件命名 工作原理 变量 模式 ...
- Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】
linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...
- Linux系统编程总结
day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...
- Linux系统编程-基本命令
Linux系统编程-基本命令 目录 1.学习目标 2.Linux/Unix操作系统简介 2.1 Linux操作系统的目标(了解) 2.2 Linux操作系统的作用(了解) 2.3 Unix家族 (了解 ...
- 【Linux】Linux系统编程(入门与系统编程)(一)(环境搭建、常见指令以及权限理解)
目录 linux系统编程 : 1.推动技术进步的基本模式 2.理解操作系统的发展 Linux 背景介绍 UNIX发展的历史: Linux发展历史 开源 Linux的发行版本: a.技术角度 b.商业化 ...
- alin的学习之路(Linux系统编程:一)(Linux基础命令)
alin的学习之路(Linux系统编程:一)(Linux基础命令) 1.Linux学习准备 操作系统的作用 向上给用户提供简单的操作计算机硬件的方式 对下管理硬件 承上启下 程序运行在操作系统上,程序 ...
- Linux系统编程——进程
一.进程概念 基础 程序:死的.只占用磁盘空间. --剧本 进程:活的.运行起来的程序.占用内存,cpu等系统资源. --戏 并发 并发的出现基于CPU的发展.然后有了多道程序设计(多进程并发执行). ...
最新文章
- 华为10GE LAN板与Wan板区别
- matlab生成实指数序列、matlab茎状图
- php流调签名,微信接口签名及调用流程详解 - 黎明互联-官方博客 - 黎明互联 - 区块链培训,PHP培训,IT培训,职业技能培训,追求极致!改变您的职业生涯!...
- 【SIP协议】学习初学笔记
- iOS开发点击UIButton实现UIView的旋转
- andriod的apk文件相关的编译反编译工具
- 韩国造智能手机时代走向终结:昔日巨头纷纷关闭生产线或削减产量
- 色彩艺术海报PSD模板 | 用色彩挑动你的情趣
- CBR VBR ABR
- 域名解析不生效,中科三方带你定位!
- linux ln命令详解
- Android Studio一直Indexing
- firefox+android+平板,Mozilla展示Android平板火狐浏览器设计细节
- xp访问win10计算机名,xp连接win10共享打印机提示凭证不足怎么办
- pandas中的dropna()方法解析
- 844.比较含退格的字符串
- linux命令名字由来--整理
- Python NLP自然语言处理详解
- DAC配置—SPI的使用
- 用计算机探索规律1 根号2,§2.5 用计算器开方
热门文章
- 1.6编程基础之一维数组_01与指定数字相同的数的个数
- awk 匹配_linux的awk命令详解,通俗易懂
- OMNeT学习之OMNeT安装与运行
- python pca降维_机器学习之sklearn中的降维算法
- Spring Boot笔记-@PathVariable的使用
- C++工作笔记-使用namespace构建常量头文件
- Spring Boot笔记-发送消息给RabbitMQ
- QML笔记-4中方式运行qml文件
- Qt官方文档阅读笔记-QStyledItemDelegate Class描述
- Java高级语法笔记-HashMap