#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
//创建文件夹 路径 掩码 
int mkdir(const char *path, mode_t mode);
// 获取当前工作路径 buf用于接受路径缓存
char *getcwd(char *buf, size_t size);

// 进入文件夹 和cd一样
int chdir(const char *path); //打开路径并建立子目录流,返回子目录流指针
DIR *opendir(const char *filename);

//读取子目录流结构
struct dirent *readdir(DIR *dirp);

//函数返回值里记录着子目录流的当前位置
long telldir(DIR *dirp);

//对dir指定的子目录流中的目录数据项的指针进行设置,loc的值用来设置指针位置,他应该通过telldir调用获得。
void seekdir(DIR *dirp, long loc);

//关闭子目录流
int closedir(DIR *dirp);

dirent 结构体之一

 struct dirent{             /* when _DARWIN_FEATURE_64_BIT_INODE is NOT defined */
  ino_t d_ino;    /* file number of entry */
  __uint16_t d_reclen; /* length of this record */
  __uint8_t d_type; /* file type, see below */
  __uint8_t d_namlen; /* length of string in d_name */
  char d_name[+];        /* name must be no longer than this */
};

举个例子

>> dir.c <<

//1. opendir()
//2. cddir()
//3. reader()
//4. closed()
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h> /*
* function: scan_dir 扫描当前 文件夹 下面的文件或文件夹
* param1: const char *dir 文件夹路径
* param2: int depth 记录文件夹深度,作用于打印时候的排版
* return: void
*/
void scan_dir(const char *dir, int depth)
{ //1.声明文件夹描述符和结构体等
DIR *dp; //文件夹描述符
struct dirent *entry; //文件夹结构体
struct stat statbuff; //文件属性结构体 if(dir == NULL) //先判断传参是否正确
{
puts("please in put dir_path");
return;
} //2. 打开文件夹
dp = opendir(dir);
if(dp == NULL)
{
puts("cant open this dir");
return;
} //3. 进入该文件夹
chdir(dir); //4.readdir会返回当前文件夹下面的子流信息,并且指针会指向下一个文件,
//每次返回的信息都保存在dirent的结构体指针中,每读完一个文件指针就会指向下一个文件,所以,读取最后一个文件时,因为没有下一个文件,返回指针为NULL
//利用这一特性,在扫描文件夹的时候,可以使用while循环。
while((entry = readdir(dp)) != NULL){ lstat(entry->d_name,&statbuff); //获取文件属性 ,entry->d_name 保存的就是文件路径 if(statbuff.st_mode & S_IFDIR) //判断是否是文件夹,如果是文件夹,就使用递归函数
{
if( strcmp(entry->d_name, ".") == || strcmp(entry->d_name,"..") == ) //跳过 . 和 .. 文件
{
continue;
}
printf(">%*s%s/\n",depth,"", entry->d_name); //将本次读取的文件夹名字打印出来
//scan_dir(entry->d_name,depth+4); //如果打开这个注释,将会进入所有子文件夹,因为这是递归操作 }else{ //如果不是文件夹,就直接输出文件名
printf("%*s%s\n",depth, "",entry->d_name );
} }
chdir("..");
closedir(dp); //最后关闭文件夹 }

>> dir.h <<

#ifndef __DIR_H
#define __DIR_H void scan_dir(const char *dir, int depth); #endif

>> main.c <<

#include <stdio.h>
#include <string.h> #include "dir.h" int main(int argc, char const *argv[])
{
puts("scan /Users dir");
scan_dir("/Users/ins/ke",); //文件夹路径根据个人随便定, 如果是系统文件夹要用sudo 来执行程序
return ;
}

2. 删除目录或文件操作

#include <unistd.h>
//删除文件夹
int rmdir(const char *path);
//删除文件
int unlink(const char *path);

linux文件操作篇 (四) 目录操作的更多相关文章

  1. LInux文件基础知识和文件目录操作(系统调用函数方式)

    1.进程是处于活动状态的程序,某个用户通过操作系统运行程序所产生的进程代表着该用户的行为.如果用户不具备访问某个目录和文件的权限,那么该用户的进程也不能访问. 2.Linux系统中文件安全机制是通过给 ...

  2. 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作

    关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...

  3. C# FTPClientHelper共公类 实现文件上传,目录操作,下载等动作

    文档说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 1.基本介绍 由于最近的项目是客户端的程序,需要将客户端的图片文件[切图]-[打包]-[ftp上传],现在就差最后一步了 ...

  4. 『学了就忘』Linux基础命令 — 19、目录操作的相关命令

    目录 1.ls命令 2.cd命令 (1)绝对路径和相对路径 (2)cd命令的简化用法 3.pwd命令 4.mkdir命令 5.rmdir命令 常用目录操作的相关命令: ls命令 cd命令 pwd命令 ...

  5. HDFS API 操作实例(二) 目录操作

    1. 递归读取文件名 1.1 递归实现读取文件名(scala + listFiles) /** * 实现:listFiles方法 * 迭代列出文件夹下的文件,只能列出文件 * 通过fs的listFil ...

  6. Linux学习笔记(二)Linux常用命令:权限、目录操作以及常见目录作用

    一.Linux命令格式 命令 [选项] [参数] 注:(1)简化选项和完整选项 -a --all (2)当有多个选项是可以写在一起 -l -a 可以写为-la 二.权限 -rw-r--r--.&quo ...

  7. UNIX环境编程学习笔记(12)——文件I/O之目录操作

    lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...

  8. LInux文件基础知识和文件目录操作(二)文件I/O操作

    1.文件I/O操作分为两部分来讲解: 第一部分是非缓冲文件操作,这种操作适合于比较小规模文件的读写和对实时性要求很高的设备的数据通信,这类操作是系统调用提供的: 第二部分是缓冲文件操作,所面向的则是大 ...

  9. linux常用命令---终端与目录操作

    终端相关操作 目录相关操作

随机推荐

  1. 利用Surfingkeys和tampermonkey效率操作网页

    tampermonkey可以实现网页载入后自动进行某些操作,适合有规律的操作,实现完全自动化. 而Surfingkeys可以实现用各种按键实现各种功能,功能全部用JavaScript写,自定义性更强.

  2. JS支持可变参数(任意多个)

    <script type="text/javascript"> function abc(){ //js中有个变量arguments,可以访问所有传入的值 for(va ...

  3. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  4. 多层感知机训练minist数据集

    MLP .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1p ...

  5. Gym - 101246D 博弈

    题意:一个无向有环的图,从 1 号结点起火,开始蔓延,两个绝顶聪明的人轮流走,谁不能走谁输,输出输的人: 分析: 当时知道是博弈,但是想当然的以为 1 号结点有一个奇数层,就必胜:其实不是这样的,当一 ...

  6. [19/03/22-星期五] 异常(Exception)(二)_捕获异常

    一.概念 捕获异常是通过3个关键词来实现的:try-catch-finally.用try来执行一段程序,如果出现异常,系统抛出一个异常,可以通过它的类型来捕捉(catch)并处理它, 最后一步是通过f ...

  7. 2018.10.3 MianShiBaoDian JavaWeb后端部分

    MSBD 四.JavaWeb后端部分 1.Tomcat的优化经验 去掉对web.xml的监控,吧jsp提前编写成servlet,由于物理内存的情况,加大Tomcat使用的jvm的内存 2.HTTP请求 ...

  8. HDU 1210 Eddy's 洗牌问题(找规律,数学)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1210 Eddy's 洗牌问题 Time Limit: 2000/1000 MS (Java/Other ...

  9. springboot缓存的使用

    spring针对各种缓存实现,抽象出了CacheManager接口,用户使用该接口处理缓存,而无需关心底层实现.并且也可以方便的更改缓存的具体实现,而不用修改业务代码.下面对于在springboot中 ...

  10. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...