Yuchuan_Linux_C编程之九目录操作相关函数
一、整体大纲

二、相关函数
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编程之九目录操作相关函数的更多相关文章
- Yuchuan_linux_C 编程之八 文件操作相关函数
一.整体大纲 st_mode整体介绍: st_mode详细介绍: 二. Linux文件操作相关函数 1. stat 作用:获得文件信息,也可以获取文件大小. 头文件 #include <sys/ ...
- Java编程的逻辑 (59) - 文件和目录操作
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- IO编程(2)-操作文件和目录
操作文件和目录 如果我们要操作文件.目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如dir.cp等命令. 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只 ...
- 《UNIX-Shell编程24学时教程》读书笔记Chap3,4 文件,目录操作
Chap3 文件操作 P28 在这章中,要着重记住一些常用的选项,要有使用正则表达式的思维,能更快达到目的.----@im天行 3.1 列文件名 .profile sh的初始化脚本: .kshr ...
- 05-Linux系统编程-第02天(文件系统、目录操作、dup2)
1 课程回顾 02-文件存储 文件名不在inode里 而是保存在一个叫dentry的结构体里了 格式化就是指定一组规则 指定对文件的存储及读取的一般方法 linux下主要使用 ext2 ext3 ex ...
- PHP核心编程--目录操作(包含文件操作)
一.目录操作 1. 创建目录 创建目录mkdir(目录名称) //返回值为布尔 一次性创建主目录及其子目录 判断是不是一个目录is_dir //返回true,false 判断目录或文件是否存 ...
- C#编程总结--总目录
C#编程总结--总目录 多年的C#实战经历,希望通过一个系列课程对C#编程做系统总结. 总结过去,展望未来.新的一年,新的征程,新的开始! 希望我们在2014梦想成真,马到成功! 1.C#编程总结(一 ...
- 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作
关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...
- Python::OS 模块 -- 文件和目录操作
os模块的简介参看 Python::OS 模块 -- 简介 os模块的进程管理 Python::OS 模块 -- 进程管理 os模块的进程参数 Python::OS 模块 -- 进程参数 os模块中包 ...
随机推荐
- K3CLOUD表关联
销售订单关联发货通知单 销售订单表 T_SAL_ORDER A T_SAL_ORDERENTRY B T_SAL_ORDERENTRY_LK C 发货通知单表 T_SAL_DELIVERYNOTICE ...
- [LC] 429. N-ary Tree Level Order Traversal
Given an n-ary tree, return the level order traversal of its nodes' values. Nary-Tree input serializ ...
- 分布式消息队列Apache Pulsar
Pulsar简介 Apache Pulsar是一个企业级的分布式消息系统,最初由Yahoo开发并在2016年开源,目前正在Apache基金会下孵化.Plusar已经在Yahoo的生产环境使用了三年多, ...
- pytest+allure高端测试报告
1.下载jdk,搭建jdk环境 下载JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.下载allure ...
- python模块之shelve,xml,hashlib,configpaser
shelve shelve模块也是一种可以将数据序列化的模块 使用方法 1. open 2. 读写 3. close 特点:使用方法比较简单 提供一个文件名字就可以开始读写,读写的方法和字典一致;跨平 ...
- Base64基础知识
转载自百度百科:http://baike.baidu.com/link?url=tI0FbG-ALTTNhRsaQHWXqdVWQDCq4bwd5Xsc0m46M8DKZ5jJyVWnr3IvTprh ...
- python去除列表中重复元素的方法
列表中元素位置的索引用的是L.index 本文实例讲述了Python去除列表中重复元素的方法.分享给大家供大家参考.具体如下: 比较容易记忆的是用内置的set 1 2 3 l1 = ['b','c', ...
- [LC] 8. String to Integer (atoi)
Implement atoi which converts a string to an integer. The function first discards as many whitespace ...
- 多版本firefox共存
https://blog.csdn.net/gavinxlf/article/details/53173034 https://blog.csdn.net/weixin_33979745/articl ...
- 接受H0的坏处|试验误差|置信度由来|
生物统计与实验设计 置信度(0.05 0.01)是通过实验次数估计值的分布得到的,它是整个分布的期望,这个值的确立需要具体情况具体分析. 肯定很难,因为否定一次很容易.虽然如果没有否定(eg:得到p= ...