管理文件和目录

  • 1. 基本概念
    • 1.1 一切皆文件
    • 1.2 索引号与链接
  • 2. stat文件状态函数
  • 3. chmod文件权限函数
  • 4. 目录函数
    • 4.1 getcwd获取当前目录
    • 4.2 mkdir创建目录
    • 4.3 rmdir删除目录
    • 4.4 chdir改变当前目录
    • 4.4 opendir打开目录与closedir关闭目录
    • 4.4 readdir读取目录信息
  • 5. 链接函数
    • 5.1 硬链接link
    • 5.2 符号链接symlink
    • 5.3 解除链接unlink
  • 6. 文件函数
    • 6.1 拷贝文件
    • 6.2 移动文件

1. 基本概念

1.1 一切皆文件

学习Linux系统最重要的一句话就是:Linux一切皆文件!包括目录、软链接、硬链接以及之前所涉及的普通文件与设备节点等,都可以理解为文件。

1.2 索引号与链接

Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。要了解链接,我们首先得了解一个概念,叫索引节点(inode)。在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号,我们可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。系统是通过索引节点(而不是文件名)来定位每一个文件。
-硬链接
硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。
-软链接
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。
也就是说,创建硬链接相当于Windows下复制文件,文件属性是一样的(iNode一样)。创建软链接相当于Windows下的快捷方式,文件属性是不一样的(iNode不一样)。

2. stat文件状态函数

通过ls命令查看到的文件信息,都可以使用stat函数组提取出来
• stat函数组
• 函数int stat(const char *path, struct stat *buf);
– 参数path:文件路径
– 参数
buf:文件信息
– 返回值:成功为0,否则为-1
• 函数int fstat(int fd, struct stat *buf);
– 参数fd:文件描述符
– 参数buf:文件信息
– 返回值:成功为0,否则为-1
• 函数int lstat(const char *path, struct stat *buf);
– 参数
path:文件路径
– 参数*buf:返回文件的信息,针对符号链接,lstat 返回链接本身,而不是而非目标文件
– 返回值:成功为0,否则为-1

参数中的结构体如下图所示:

读取文件状态例程如下所示:

#include <stdio.h>
//通过man文档可以查看到stat函数组头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>//open函数的参数头文件
#include <fcntl.h>int main(int argc,char *argv[])
{struct stat groupstat;int fd,ret;if(argc <2){printf("\nPlease input file path\n");return 1;}//stat函数测试    ret = stat(argv[1],&groupstat);if(ret){printf("Please make sure file path\n");return 1;}printf("stat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);//fstat函数测试fd = open(argv[1],O_RDWR|O_NOCTTY|O_NDELAY);if(fd<0){printf("Please make sure file path\n");return 1;}ret = fstat(fd,&groupstat);if(ret){printf("Please make sure file path\n");return 1;}printf("fstat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);//lstat函数测试   ret = lstat(argv[1],&groupstat);if(ret){printf("Please make sure file path\n");return 1;}printf("lstat function test , %s of st_ino inode is %ld\n",argv[1],groupstat.st_ino);return 0;
}

3. chmod文件权限函数

• int chmod(const char *path, mode_t mode);
– 参数*path:文件路径。
– 参数mode:直接使用数字即可。和前面命令中chmod 777 xxx 中的777 这
个参数含义类似,也可以使用文档中的组合值。
– 返回值:成功返回0,错误返回-1。
• int fchmod(int fd, mode_t mode);
– 参数fd:文件描述符。
– 参数mode:直接使用数字即可。和前面命令中chmod 777 xxx 中的777 这
个参数含义类似,也可以使用文档中的组合值。
– 返回值:成功返回0,错误返回-1。

#include <stdio.h>#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc,char *argv[])
{int fd,ret;if(argc <3){printf("\nPlease input file path\n");return 1;}//chmod函数测试 ret = chmod(argv[1],0777);if(ret<0){printf("Please make sure file path\n");return 1;}printf("chmod %s 0777 is success!\n",argv[1]);//fchmod函数测试     fd = open(argv[2],O_RDWR|O_NOCTTY|O_NDELAY);if(fd<0){printf("Please make sure file path\n");return 1;}ret = fchmod(fd,0555);if(ret<0){printf("Please make sure file path\n");return 1;}printf("fchmod %s 0555 is success!\n",argv[1]);return 0;
}

4. 目录函数

4.1 getcwd获取当前目录

linux命令中可以使用pwd查看当前目录,系统编程中可以通过getcwd获取当前目录
• char *getcwd(char *buf, size_t size);
– 参数buf:保存当前目录的缓冲区
– 参数size:在现代linux 中,buf 的长度至少可以为255 字节
– 返回值:成功返回指向当前目录的指针,和buf 的值一样,错误返回NULL
• char *getwd(char *buf);该函数已经过时,使用的时候会有警告
– 参数
buf:保存当前目录的缓冲区
– 返回值:成功返回指向当前目录的指针,和buf 的值一样,错误返回NULL
• char *get_current_dir_name(void);
– 参数:无
– 返回值:成功返回指向当前目录的指针,错误返回NULL

#include <stdio.h>
/*getcwd、getwd和get_current_dir_name
函数的头文件*/
#define __USE_GNU
#include <unistd.h>#define LENTH 255
int main()
{char pwd[LENTH];char *wd;
//getcwd函数测试        if(!getcwd(pwd,LENTH)){perror("getcwd");return 1;}printf("\ngetcwd pwd is %s\n",pwd);//getwd函数测试wd = getwd(pwd);if(!wd){perror("getcwd");return 1;}printf("\ngetwd pwd is %s\n",wd);//get_current_dir_name函数测试 wd = get_current_dir_name();if(!wd){perror("getcwd");return 1;}printf("\nget_current pwd is %s\n",wd);return 0;
}
4.2 mkdir创建目录

linux命令中可以使用mkdir创建目录,系统编程中可以通过mkdir函数新建目录。
• int mkdir(const char *pathname,mode_t mode);
– 参数*pathname:文件和目录的路径

  • 参数mode:直接使用数字即可。和前面命令中chmod 777 xxx中的777这个参数含义类似,也可以使用文档中的组合值。
    – 返回值:成功返回0,错误返回-1
#include <stdio.h>
//mkdir函数头文件
#include <sys/stat.h>
#include <sys/types.h>int main(int argc,char *argv[])
{int ret;//检测参数 if(argc <2){printf("\nPlease input file path\n");return 1;}
//使用mkdir函数新建目录ret = mkdir(argv[1],0777);if(ret<0){printf("mkdir %s failed!\n",argv[1]);return 1;}printf("mkdir %s suceces!\n",argv[1]);return 0;
}
4.3 rmdir删除目录

linux命令中可以使用rmdir删除目录,系统编程中可以通过rmdir删除目录。
• int rmdir(const char *pathname);
– 参数*pathname:文件和目录的路径
– 返回值:成功返回0,错误返回-1

#include <stdio.h>
//rmdir函数头文件
#include <unistd.h>int main(int argc,char *argv[])
{int ret;//检测参数 if(argc <2){printf("\nPlease input file path\n");return 1;}
//使用rmdir函数删除目录ret = rmdir(argv[1]);if(ret<0){printf("rmdir %s failed!\n",argv[1]);return 1;}printf("rmdir %s suceces!\n",argv[1]);return 0;
}
4.4 chdir改变当前目录
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//chdir和fchdir函数头文件
#include <unistd.h>#define LENTH 255int main(int argc,char *argv[])
{int ret;char pwd[LENTH];//检测参数 if(argc <3){printf("\nPlease input file path\n");return 1;}//getcwd函数获取当前目录        if(!getcwd(pwd,LENTH)){perror("getcwd");return 1;}printf("\ngetcwd pwd is %s\n",pwd);//使用chdir函数转入其他目录ret = chdir(argv[1]);if(ret){printf("Please make sure file path\n");return 1;}printf("chdir %s is success!\n",argv[1]);//转入其他目录,完成操作
//使用rmdir函数删除目录ret = rmdir(argv[2]);if(ret<0){printf("rmdir %s failed!\n",argv[2]);return 1;}printf("rmdir %s is success!\n",argv[2]);//再次使用chdir回到pwd保存的目录ret = chdir(pwd);if(ret){printf("Please make sure file path\n");return 1;}printf("chdir %s is success!\n",pwd);return 0;
}
4.4 opendir打开目录与closedir关闭目录

前面介绍open和close函数用于打开关闭文件,这里介绍的opendir和closedir用于打开目录,相当于ls命令
DIR *opendir(const char *name);
– 参数:目录的路径。
– 返回值:成功返回指向目录流的指针,错误返回NULL
• int closedir(DIR *dirp);
– 参数:opendir 返回的dir 指针
– 返回值:成功返回0, 失败返回-1

#include <stdio.h>
//opendir和closedir函数头文件
#include <dirent.h>
#include <sys/types.h>int main(int argc,char *argv[])
{int ret;DIR *dir;//检测参数    if(argc <2){printf("\nPlease input file path\n");return 1;}
//使用opendir函数打开目录dir = opendir(argv[1]);if(dir==NULL){printf("opendir %s failed!\n",argv[1]);return 1;}printf("opendir %s suceces!\n",argv[1]);
//使用closedir函数关闭目录closedir(dir);return 0;
}
4.4 readdir读取目录信息

• 读目录信息函数
• struct dirent *readdir(DIR *dirp);
– 参数dirp:opendir 函数打开目录后返回的文件指针。
– 返回值:成功返回指向dirp 的指针dirent ,错误返回NULL。

#include <stdio.h>
//opendir,closedir,readdir函数头文件
#include <dirent.h>
#include <sys/types.h>int main(int argc,char *argv[])
{int ret;DIR *dir;struct dirent *catlog;
//检测参数  if(argc <2){printf("\nPlease input file path\n");return 1;}
//使用opendir函数打开目录dir = opendir(argv[1]);if(dir==NULL){printf("opendir %s failed!\n",argv[1]);return 1;}printf("opendir %s suceces!\n",argv[1]);
//使用readdir读取目录argv[1]catlog = readdir(dir);if(catlog == NULL){printf("readdir %s failed!\n",argv[1]);return 1;}printf("%s d_ino is %ld\n ",argv[1],catlog->d_ino);
//使用closedir函数关闭目录closedir(dir);return 0;
}

5. 链接函数

5.1 硬链接link

• 硬链接命令为ln,函数为link
• 硬链接函数
int link(const char *oldpath, const char *newpath);
– 参数oldpath:已有的文件路径。
– 参数
newpath:新建的硬链接文件路径。
– 返回值:成功返回0,错误返回-1。

#include <stdio.h>
//link函数头文件
#include <unistd.h>int main(int argc,char *argv[])
{int ret;if(argc <3){printf("\nPlease input file path\n");return 1;}//测试link函数ret = link(argv[1],argv[2]);if(ret){printf("link failed");return 1;}printf("link %s to %s success!\n",argv[1],argv[2]);return 0;
}
5.2 符号链接symlink

符号链接也叫软链接,symlink
• 软链接函数
int symlink(const char *oldpath, const char *newpath);
– 参数oldpath:已有的文件路径
– 参数
newpath:新建的符号链接文件路径
– 返回值:成功返回0,错误返回-1

#include <stdio.h>
//symlink函数头文件
#include <unistd.h>int main(int argc,char *argv[])
{int ret;if(argc <3){printf("\nPlease input file path\n");return 1;}//测试symlink函数ret = symlink(argv[1],argv[2]);if(ret){printf("symlink failed");return 1;}printf("symlink %s to %s success!\n",argv[1],argv[2]);return 0;
}
5.3 解除链接unlink

解除链接unlink
• 解除链接函数
int unlink(const char *pathname);
– 参数*pathname:链接文件的路径
– 返回值:成功返回0,错误返回-1
– unlink指向软链接,删除软链接;指向最后一个硬链接,相当于删除文件

#include <stdio.h>
//unlink函数头文件
#include <unistd.h>int main(int argc,char *argv[])
{int ret;if(argc <2){printf("\nPlease input file path\n");return 1;}//测试unlink函数ret = unlink(argv[1]);if(ret){printf("unlink failed");return 1;}printf("unlink %s is success!\n",argv[1]);return 0;
}

6. 文件函数

6.1 拷贝文件

Linux 下并没有专门的拷贝函数和接口,需要通过open,read,wite 等文件操作函数实现。流程图如下:

#include <stdio.h>#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>//argv[1] is oldpath ; argv[2] is newpath
#define LENTH 1024
int main(int argc,char *argv[])
{int fds,fdt;char buffer[LENTH];char *fileold,*filenew;fileold = argv[1];filenew = argv[2];if(argc <3){printf("\nPlease input file path\n");return 1;}//打开oldpath        fds = open(fileold,O_RDWR);if(fds<0){printf("Please make sure file path\n");return 1;}//打开newpath,如果没有则创建目标文件fdt = open(filenew,O_WRONLY|O_CREAT);if(fdt<0){printf("Please make sure file path\n");return 1;}//读和写操作while(read(fds,buffer,LENTH)){write(fdt,buffer,strlen(buffer));}//关闭文件close(fds);close(fdt);printf("cp to finished!\n");printf("cp %s to %s success!\n",fileold,filenew);return 0;
}
6.2 移动文件

移动文件命令为mv,函数为rename
**• int rename(const char oldpath, const char newpath)
– 参数oldpath:旧的文件路径
– 参数
newpath:新的文件路径
– 返回值:成功返回0,错误返回-1

#include <stdio.h>#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>//argv[1] is oldpath ; argv[2] is newpath
int main(int argc,char *argv[])
{int ret;if(argc < 3){printf("\nPlease input file path\n");return 1;}if(ret = rename(argv[1],argv[2])){printf("\nerr\n");}printf("rename %s to %s success!\n",argv[1],argv[2]);return 0;
}

Linux基础(10)--管理文件和目录相关推荐

  1. linux文件操作和目录操作,Linux基础操作1——文件和目录

    Linux基础操作1--文件和目录 一.目录 1.mkdir dirname 建立子目录. 注意:用户不能在一个不存在的目录中建立子目录. 2.mkdir data 在当前目录下建立子目录data 3 ...

  2. linux对目录进行操作,Linux 基础:对文件和目录进行操作的 Linux 和 Unix 命令 笔记...

    参考文章<Linux Basic – Linux and Unix Commands for File and Directory Manipulation> https://www.ji ...

  3. 删除一个程序Linux,一天一个Linux基础命令删除文件或目录命令rm

    rm删除文件命令 1.命令格式 rm [options]  file... 2.命令功能 rm命令,删除文件命令,是Linux系统下常用命令,该命令的功能为删除一个文件或者整个目录或者目录中的部分文件 ...

  4. linux命令之-管理文件和目录的命令

    一. 创建和删除目录的命令 1.mkdir 命令 (1)一般格式:mkdir   [选项]   目录名 (2)说明:该命令创建由目录名命名的目录. (3)举例1: 在目录 /usr/fedora 下建 ...

  5. Linux基础命令 删除文件或目录

    rm 命令 可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 语法: rm (选项)(参数) 选 ...

  6. linux属性表示的文件,Linux基础入门:文件和目录属性的含义

    比如 : [root@istester isTester]# ll total 12 drwxr-xr-x 2 root root 4096 May 21 17:58 21Day -rw-r-xr-- ...

  7. Linux基本命令(1)管理文件和目录的命令

    Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touc ...

  8. Linux 基础 - 用户管理

    Linux 基础 - 用户管理 Linux 用户管理 查看当前用户 ID:id 查看当前所属组:groups 查看当前登录用户:who 查看当前登录用户详细信息:w 调查用户:finger 新增用户: ...

  9. linux权限命令chgrp,Linux 基础——权限管理命令chown、chgrp

    一.chown命令与chgrp命令的作用 有时你需要改变文件或目录的属主,比如有人离职或开发人员创建了一个在测试或生产环境中需要归属在系统账户下的应用.Linux提供了两个命令来实现这个功能:chow ...

最新文章

  1. windows键盘在mac上怎么识别_Mac电脑怎么使用pc键盘?
  2. LeetCode:验证回文串【125】
  3. 改进型的时钟置换算法-解惑
  4. 手把手教安装java开发环境_手把手教你配置java开发环境-java环境变量设置
  5. break和continue的方法(break 直接跳出循环)与 (continue本次忽略,但之后的继续)
  6. rxjava结合_RxJava结合最新,与最新发件人
  7. 适配器模式之备忘录模式
  8. HTTP长连接和Websocket
  9. 简约、高质量简历模板
  10. ​一文看尽MAE最新进展!恺明的MAE已经提出大半年,目前发展如何?
  11. 海马体启发的记忆模型
  12. java基础巩固-宇宙第一AiYWM:为了维持生计,单例模式阅读总结【单例模式不同写法、在JDK中的应用】~整起
  13. 大数据征信|芝麻信用、腾讯信用和51信用卡等信用评分模型解析
  14. 个税局端服务器处理结果查询不到三方协议,「实用」电子税务局中三方协议验证失败如何处理?来看攻略啦!...
  15. 系统日志及数据库日志
  16. 【webGoat】Broken Access Control
  17. 医疗器械三类申请需要提交什么材料?
  18. 【强化学习PPO算法】
  19. ios 连续点击button_iOS小技巧:用runtime 解决UIButton 重复点击问题
  20. 中国石油大学《法学导论》第一次在线作业

热门文章

  1. Java jar 修改(springfox-swagger-ui-2.9.2.jar 修改去掉顶部的绿色topbar,汉化)
  2. php期末作业经验,期末作业.php
  3. 2021年下半年网络规划设计师下午真题及答案解析
  4. 第五章应用系统安全基础备考要点及真题分布
  5. python numpy遍历_NumPy 迭代数组
  6. python中有数组吗_python里面有数组吗
  7. jQuery怎么改变img的src
  8. Mysql——查看数据库,表占用磁盘大小
  9. Git使用六:版本对比
  10. CAutoupdater通用 自动升级组件用户手册