一、整体大纲

二、相关函数

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. SGD/BGD/MBGD使用python简单实现

    算法具体可以参照其他的博客: 随机梯度下降: # coding=utf-8 ''' 随机梯度下降 ''' import numpy as np # 构造训练数据 x = np.arange(0., 1 ...

  2. 如何使用css伪类,实现div左上角出现封面等提示信息

     HTML <div class="ui-cover-tip”><div> CSS .ui-cover-tip{ position: relative; width: ...

  3. OfficeCommandbarViewer20171005.rar

    OfficeCommandbarViewer用于查看Office各组件工具栏和控件信息的一款软件. 采用了本地XML文件的方式,所以使用本工具不需要提前打开任何Office组件. 动态图: 下载地址: ...

  4. conditon 实现等待/通知

    synchronized 与wait() 和notify() notifyAll() 方法相结合可以实现等待 通知 ReetrantLock也可以实现同样的功能 需要借助condition对象,一个l ...

  5. ios 中键盘被遮挡解决方案

    1.当view是非可以滚动的view时, // 添加对键盘的通知 - -(void)viewDidLoad{ [[NSNotificationCenter defaultCenter] addObse ...

  6. js求两个数的百分比

    function toPercent(num, total) { return (Math.round(num / total * 10000) / 100.00 + "%");/ ...

  7. 吴裕雄--天生自然python学习笔记:Python uWSGI 安装配置

    本文主要介绍如何部署简单的 WSGI 应用和常见的 Web 框架. 以 Ubuntu/Debian 为例,先安装依赖包: apt-get install build-essential python- ...

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

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

  9. 翻转链表和k个一组翻转以及两两反转

    一.输入一个链表,输出反转后的链表. 非递归实现: # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.v ...

  10. 【一定要记得填坑】LG_3822_[NOI2017]整数

    挺好的一道题,由于快noip了,所以打算noip之后再添题解的坑.