一、整体大纲

二、相关函数

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. 《C程序设计语言》练习 1-12

    #include<stdio.h> /*编写一个程序,以每行一个单词的形式打印其输入*/ main() { int c; c=getchar(); while(c!=EOF) { if ( ...

  2. “pip install tensorflow ”出现错误

    在控制台命令窗口输入:pip install tensorflow之后出现一长串bug怎么解决 网上百度了一些方法: 安装Python3.5 安装Python3.6 总结原因:Python3.7没有合 ...

  3. OpenCV、EmguCV函数注解

  4. CF-544:部分题目总结

    -------------------昨天打的重现赛,感觉是我打的发挥的最好的一场比赛了,六题都一次AC.那么就来总结一下吧 题目链接:http://codeforces.com/contest/11 ...

  5. MS15-020 文件共享漏洞利用

    Metasploit MS15-020漏洞利用 环境: 共享机/受害者:windows xp IP:192.168.222.1 攻击机:kali linux IP:192.168.10.1 msfco ...

  6. Java IO: InputStreamReader和OutputStreamWriter

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍InputStreamReader和OutputStreamWriter.细心的读者可 ...

  7. LeetCode Day 5

    LeetCode0005 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab& ...

  8. C# 内置的类型转换方法

    C# 提供了下列内置的类型转换方法: 序号 方法 & 描述 1 ToBoolean把类型转换为布尔型. 2 ToByte把类型转换为字节类型. 3 ToChar如果可能的话,把类型转换为单个 ...

  9. Mac使用sublime text3的快捷键

    符号说明⌘:command⌃:control⌥:option⇧:shift↩:enter⌫:delete 打开/关闭/前往⌘⇧N 打开一个新的sublime窗口⌘N 新建文件⌘⇧W 关闭sublime ...

  10. 如何创建Hexo站点的Tags和Categories默认页面

    安装Hexo的categories生成插件 1 $ npm install hexo-generator-category --save 安装Hexo的Tags生成插件 1 $ npm install ...