一、整体大纲

二、相关函数

1. getcwd

  • 函数作用:获取当前目录
  • 头文件
 #include <unistd.h>
  • 函数原型
 char *getcwd(char *buf, size_t size);
  • 参数说明:

buf传出参数,路径
          size缓冲区大小

  • 返回值

成功:返回路径的指针
          失败:返回NULL

2. chdir

  • 函数作用:改变工作路径
  • 头文件

#include <unistd.h>

  • 函数原型
 int chdir(const char *path);
  • 函数参数:

path对应的目标工作路径

  • 返回值

成功:返回0
          失败:返回-1,设置errno

注意:改变工作路径-注意属于进程独有。

示例:

 #include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h> int main(int argc, char *argv[])
{
if (argc != )
{
printf("./a.out filename\n");
return -;
} //先切换工作目录
chdir(argv[]); int fd = open("temp.txt", O_WRONLY|O_CREAT, );
write(fd, "daociyiyou", );
close(fd); //获取当前工作目录
char buf[] = {};
getcwd(buf, sizeof(buf));
printf("buf is %s\n", buf); return ;
} chdir示例

chdir示例

3. mkdir

  • 函数作用:创建目录
  • 头文件
 #include <sys/stat.h>
#include <sys/types.h>
  • 函数原型
 int mkdir(const char *pathname, mode_t mode);
  • 参数说明:

pathname创建的目录路径
          mode目录权限 (mode & ~umask & 01777),注意权限,如果目录没有可执行权限,不可进入

  • 返回值

成功:返回0
          失败:返回-1,设置errno

4. rmdir

  • 函数作用:只能删除空文件夹

5. opendir

  • 函数作用:打开目录
  • 头文件
 #include <sys/types.h>
#include <dirent.h>
  • 函数原型
 DIR *opendir(const char *name);
  • 参数说明:

pathname打开的目录

  • 返回值

成功:返回指向该目录流的指针
          失败:返回-1,设置errno

6. readdir

  • 函数作用:读目录
  • 头文件
 #include <dirent.h>
  • 函数原型
 struct dirent *readdir(DIR *dirp);
  • 参数说明:

dirp传入参数,opendir返回的指针

  • 返回值

成功:读到目录项的内容
          失败:NULL代表读到末尾或者有错误

 struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* not an offset; see NOTES */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported by all file system types */
char d_name[]; /* filename */
};

7. closedir

  • 函数作用:关闭目录
  • 头文件
 #include <sys/types.h>
#include <dirent.h>
  • 函数原型
 int closedir(DIR *dirp);
  • 函数参数:

dirp传入参数,opendir返回的指针

  • 返回值

成功:返回0
          失败:返回-1,设置errno

需求:统计一下指定目录下的文件个数?

 #include <stdio.h>
#include<unistd.h>
#include<dirent.h>
#include<string.h>
#include <sys/types.h> int count = ; int DirCount(char *dirname)
{
printf("================dirname:%s================\n", dirname);
//打开目录
DIR *dirp = opendir(dirname);
if (NULL == dirp)
{
perror("opendir err:");
return -;
}
//循环读目录,如果是普通文件,count++,如果是目录,继续调用DirCount
struct dirent *dentp = NULL;
while ((dentp = readdir(dirp)) != NULL)
{
if (dentp->d_type == DT_DIR) //如果是目录
{
if (strcmp(dentp->d_name, ".") == || strcmp(dentp->d_name, "..") == )
{
continue;
}
printf("================dirname:%s, dtype:%d================\n", dentp->d_name, dentp->d_type);
//注意进程的工作路径,不能直接打开子目录
//使用dirname拼接下一级子目录
char newdirname[] = {};
sprintf(newdirname, "%s/%s", dirname, dentp->d_name);
DirCount(newdirname);
}
if (dentp->d_type == DT_REG)
{
count++;
printf("-------------filename:%s, dtype:%d------------\n", dentp->d_name, dentp->d_type);
}
}
//关闭目录
closedir(dirp);
return ;
} int main(int argc, char *argv[])
{
if (argc != )
{
printf("./a.out dirname\n");
return -;
}
DirCount(argv[]);
printf("total file count %d\n", count); return ;
} 统计指定目录下文件个数

统计指定目录下文件个数

8. dup2

  • 函数作用:文件描述符重定向
  • 头文件
 #include <unistd.h>
  • 函数原型
 int dup2(int oldfd, int newfd);
  • 参数说明:

关闭newfd对应的文件描述符,将newfd重新指向为old对应的文件

  • 返回值

成功:返回0
           失败:返回-1,设置errno

9. dup

  • 函数作用:复制文件描述符
  • 头文件
 #include <unistd.h>
  • 函数原型
 int dup(int oldfd);
  • 参数说明:

新返回一个文件描述符指向oldfd对应的文件

  • 返回值

成功:返回0
          失败:返回-1,设置errno

需求:在代码中执行2次printf("hello world\n");一次输出到hello文件,后一次输出到屏幕上?

 #include <stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h> int main(int argc, char *argv[])
{
if (argc != )
{
printf("./a.out filename\n");
return -;
}
//先备份现场
int outfd = dup();
//先做重定向
int fd = open(argv[], O_WRONLY|O_CREAT, );
dup2(fd, );
printf("Hello world\n");
//必须刷新
fflush(stdout); //需要回复1,重新对应标准输出
dup2(outfd, );
printf("Hello world\n"); close(fd); return ;
} 需求实现

需求实现

10. errno

  • 函数作用:输出函数,根据errnum得到相应的错误信息
  • 头文件
 #include <string.h>
  • 函数原型:
 char *strerror(int errnum);

11. fcntl

  • 改变已经打开的文件的属性
  • 打开文件的时候: 只读
  • 修改文件的: 添加追加 O_APPEND

三、补充

1. 索引节点inode

保存的其实是实际的数据的一些信息,这些信息称为“元数据”(也就是对文件属性的描述)。例如:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。( 注意数据分成:元数据+数据本身 )

注意inode怎样生成的:每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定(现代OS可以动态变化),一般每2KB就设置一个inode。一般文件系统中很少有文件小于2KB的,所以预定按照2KB分,一般inode是用不完的。所以inode在文件系统安装的时候会有一个默认数量,后期会根据实际的需要发生变化。

注意inode号:inode号是唯一的,表示不同的文件。其实在Linux内部的时候,访问文件都是通过inode号来进行的,所谓文件名仅仅是给用户容易使用的。当我们打开一个文件的时候,首先,系统找到这个文件名对应的inode号;然后,通过inode号,得到inode信息,最后,由inode找到文件数据所在的block,现在可以处理文件数据了。

2. inode和文件的关系

当创建一个文件的时候,就给文件分配了一个inode。一个inode只对应一个实际文件,一个文件也会只有一个inode。inodes最大数量就是文件的最大数量。

Yuchuan_Linux_C编程之九目录操作相关函数的更多相关文章

  1. Yuchuan_linux_C 编程之八 文件操作相关函数

    一.整体大纲 st_mode整体介绍: st_mode详细介绍: 二. Linux文件操作相关函数 1. stat 作用:获得文件信息,也可以获取文件大小. 头文件 #include <sys/ ...

  2. Java编程的逻辑 (59) - 文件和目录操作

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  3. IO编程(2)-操作文件和目录

    操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...

  4. 《UNIX-Shell编程24学时教程》读书笔记Chap3,4 文件,目录操作

    Chap3 文件操作   P28 在这章中,要着重记住一些常用的选项,要有使用正则表达式的思维,能更快达到目的.----@im天行 3.1 列文件名 .profile  sh的初始化脚本: .kshr ...

  5. 05-Linux系统编程-第02天(文件系统、目录操作、dup2)

    1 课程回顾 02-文件存储 文件名不在inode里 而是保存在一个叫dentry的结构体里了 格式化就是指定一组规则 指定对文件的存储及读取的一般方法 linux下主要使用 ext2 ext3 ex ...

  6. PHP核心编程--目录操作(包含文件操作)

    一.目录操作 1.    创建目录 创建目录mkdir(目录名称)  //返回值为布尔 一次性创建主目录及其子目录 判断是不是一个目录is_dir  //返回true,false 判断目录或文件是否存 ...

  7. C#编程总结--总目录

    C#编程总结--总目录 多年的C#实战经历,希望通过一个系列课程对C#编程做系统总结. 总结过去,展望未来.新的一年,新的征程,新的开始! 希望我们在2014梦想成真,马到成功! 1.C#编程总结(一 ...

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

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

  9. Python::OS 模块 -- 文件和目录操作

    os模块的简介参看 Python::OS 模块 -- 简介 os模块的进程管理 Python::OS 模块 -- 进程管理 os模块的进程参数 Python::OS 模块 -- 进程参数 os模块中包 ...

随机推荐

  1. nginx相关地址

    http://www.nginx.cn/doc/      中文文档 http://nginx.org/en/docs/      英文文档 https://pan.baidu.com/s/1qWAZ ...

  2. 分布式全局唯一ID与自增序列

    包含时间顺序的ID 此场景最简单的实现方案,就是采用 twitter 的 Snowflake 算法.ID总长64位,第1位不可用,41位表示时间戳,10位表示生成机器的id,后12位表示序列号. 为什 ...

  3. 攻防世界web新手区做题记录

    学校信安协会第一次培训结束后的作业,要求把攻防世界的web新手区题目做一遍并写题解. 第一题 view_source 查看源代码右键不能用,但是F12能用,于是找到源代码 输入到flag框即可 后来在 ...

  4. Leetcode14._最长公共前缀

    题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&q ...

  5. spring注入原型bean

    <bean id="httpClient" class="org.apache.commons.httpclient.HttpClient" scope= ...

  6. java 变量分类

    转:https://blog.csdn.net/suneqing/article/details/37909811 1.按被声明的位置划分 局部变量:方法和语句块内定义的的变量.(在定义局部变量时,必 ...

  7. C++ new和delete运算符简介

    在C语言中,动态分配内存用 malloc() 函数,释放内存用 free() 函数.如下所示: ); //分配10个int型的内存空间 free(p); //释放内存 在C++中,这两个函数仍然可以使 ...

  8. Introduction to Computer Science and Programming in Python--MIT

    学习总结--(Introduction to Computer Science and Programming in Python--MIT) 导论 主题 重新利用数据结构来表达知识 理解算法的复杂性 ...

  9. SpringMVC源码剖析1——执行流程

    SpringMVC源码剖析1——执行流程 00.SpringMVC执行流程file:///C:/Users/WANGGA~1/AppData/Local/Temp/enhtmlclip/Image.p ...

  10. HDU-1711-Number Sequence(KMP)(Rabin-Karp)

    Rabin-Karp Accepted 1711 904MS 5272K 1310 B G++ #include "bits/stdc++.h" using namespace s ...