虚拟文件系统(VFS)概述:

VFS位于文件系统、和访问文件的系统调用(API)之间,为系统调用访问文件系统提供统一的抽象接口。

不同文件系统连接成一个单一树形结构,分别挂载(自己挂载需要用mount命令)在VFS上,采用POSIX系统调用读写不同的文件系统——使得不同文件系统之间进行数据交换和同时管理非常地方便。文件系统用mount命令挂载举例:

cdrom在Linux中的挂载:mount -t iso9660 /dev/cdrom/mnt/cdrom。nfs的挂载:mount -t nfs 127.0.0.1:/mnt/nfs/mnt/nfs。

文件的访问方式:

  1. 系统调用(当然不止于访问文件系统)——非缓冲文件操作。
  2. ANSI  C库函数——缓冲文件操作(就是输入输出操作等)。

文件流:三个标准流stdin、stdout、stderr,对应的文件描述符0、1、2,其作用是:

  1. 实现了不同输入输出的格式转换。
  2. 缓冲功能,使得数据可以集中读写处理,减少系统调用次数。

缓冲有三种:

  1. 全缓冲:在缓冲区满或者调用刷新函数后,才会进行I/O系统调用(即输入输出)。
  2. 行缓冲:缓冲区满或者遇到换行符,才I/O系统调用。
  3. 无缓冲(不输出):如标准出错流。

#include <stdio.h>一些常用的库函数:

打开文件:FILE *fopen(文件名,打开模式mode),成功打开则返回文件流指针,否则返回NULL。所谓打开文件,就是为文件申请一个文件缓冲区和一个FILE结构体,可以通过FILE流指针操纵。具体的打开模式如下:

  1. "r"或者"rb"(只读):打开一个二进制/文本文件,读取数据。只能打开已存在文件。
  2. "w"或者"wb"(只写):打开或建立一个二进制/文本文件,写入数据。若文件存在,则将文件中数据清空,再写入;若不存在,则新建一个文件,写入。
  3. "a"或者"ab"(追加):打开或新建一个二进制/文本文件,追加数据。就是说,只写嘛。
  4. "r+"或者"rb+"(可读可写):打开一个二进制/文本文件,读写数据。只能打开已存在文件。
  5. "w+"或者"wb+"(可读可写):新建一个二进制/文本文件,读写数据。
  6. "a+"或者"ab+"(可读可写):打开或新建一个二进制/文本文件,追加数据。

向文件写入n段数据:int fwrite(字符串,字符串长度size,n,文件流指针),写入n段数据,每段长度为size(一般就一段)。写入成功则返回实际写入段数,否则返回0。

从文件中读取n段数据:int fread(char buf[],unsigned size,unsigned n,FILE *fp),其实fread和fwrite的参数一样,读取的数据根据段数,一次保存在buf中。读取成功则返回实际读取段数,否则返回0。

移动文件读写指针:int fseek(文件流指针,偏移量,参照位置),和系统调用lseek不同(注意参照位置和偏移量,两个函数相反)。返回值也不一样,移动成功则返回0,否则返回非0。

文件描述符和文件流的相互转换:

  1. 文件流—>文件描述符:int fileno(FILE*stream),成功则返回文件描述符,否则返-1。
  2. 文件描述符—>文件流:FILE *fdopen(int fileD,模式),成功则返回新的文件流,否则返回NULL。

字符串格式化:int sprintf(目的字符串,格式,源字符串1,...),返回格式化后,目的字符串的长度,例如:

char source[] = "yangwen";
char dest[] = "";
sprintf(dest, "This is %s\n", source); //然后source保持不变,dest变成格式+source

系统调用:

文件操作:

打开文件:int open(文件名,文件操作类型flag),返回文件描述符,否则返回-1。int open(文件名,文件操作类型flag,打开权限mode)。flag一般为O_WRRD就行了,而mode有所有者、用户组、其他用户权限,第三个参数一般在打开文件不存在,flag为O_CREAT时,才会用到,可以使用八进制的方式,如0777,也可以用宏,如S_IRWXU——文件所有者具有可读可写可执行权限。

关闭文件:int close(文件描述符),关闭用open打开的文件,所以参数,文件描述符为open返回过的。

管理文件:int fcntl(文件描述符,操作cmd,...),常用操作有:F_DUPFD:复制文件描述符,F_GETFD、F_SETFD:获取或者设置文件描述符的close_on_exec标志?(什么东西),F_GETFL、F_SETFL:获取文件描述符的操作类型flag。

将size个字节的字符串写入文件:size_t write(文件描述符,字符串,字符串大小size),成功则返回实际写入的字符串大小(在0-size之间),否则返回-1。

读取文件中前size个字节的内容,并保存到字符串中:read(文件描述符,字符串,字符串大小size),而且只要open不更改打开模式,默认情况会在文件内容为空时,阻塞进程;成功则返回实际读到的字符串大小(当然,肯定在0-'字符串大小'之间),否则返回-1。

设置正在读写的文件的,指针指向的位置:off_t lseek(文件描述符,设置的参照位置,偏移量),其中参照位置并非指针最终位置,最终位置=参照位置+偏移量(相对于参照位置),具体的参照位置不能随便给,有三个选项:SEEK_SET文件开头位置0、SEEK_CUR当前位置1、SEEK_END文件末尾位置2。设置成功则返回文件头到设置的位置的偏移差(以字节为单位),否则返回-1。

目录操作:

打开目录:DIR *opendir(目录名)。成功则返回目录流指针,否则返回NULL。

每调用一次,就返回目录流下一个数据项(文件)的数据结构指针:struct dirent *readdir(目录流)。当读取错误或者已到目录尾时,返回NULL。获得目录流中,指向的文件的名称:dirent->d_name(为一个字符串)。

获得目录流中数据项指针的当前指向位置(就是目录下的哪个文件):long int telldir(目录流指针)。设置位置:void seekdir(目录流指针,位置long int loc)。

创建目录:int mkdir(目录名,打开模式mode),mode相当于<打开文件open函数的mode>设置为O_CREAT。成功则返回0,否则返回-1。删除目录:int rmdir(目录名),要求目录为空(即目录下没有文件)。成功则返回0,否则返回-1。

将当前目录名称保存到指定变量buf中:char *getcwd(char *buf,buf数组的大小size),因为要将目录名(绝对路径)保存到buf数组中,所以buf数组的大小必须比目录名大1。所以成功获取则返回buf数组(或者说这个指针),否则就返回NULL(size部队)。

更改目录:int chdir(新目录名)。成功则返回0,否则返回-1。

文件属性管理:

获取文件的状态信息:

int fstat(文件描述符,struct stat *buf),将文件信息保存在指向的stat结构体中。

int stat(文件名,struct stat *buf)、int lstat(文件名,struct stat *buf)。对于普通文件,此二者无差;而对于软链接,stat直接返回链接文件的文件信息,而lstat返回指向文件的信息。

stat结构体的主要内容:

  • st_mode:文件权限和文件类型
  • st_ino:与文件关联的inode值
  • st_dev:文件设备号,代表文件保存在哪个设备上
  • st_uid:文件属主的用户ID号
  • st_gid:文件属主的组ID号
  • st_atime:文件上次被访问时间
  • st_ctime:文件属性上次被修改时间(就是文件stat属性被更改)
  • st_mtime:文件内容上次被修改时间
  • st_nlink:文件硬链接个数

UID、GID向文件拥有者、拥有者组名转换:
由于文件的属性stat中只有两个ID,而没有对应的用户名和组名,所以需要使用另外两个结构体passwd、group,通过它们来获得对应的名称。

UID——>用户名:struct passwd *getpwnam(文件名);struct passwd *getpwuid(uid_t uid)。例如,现在获得了一个struct passwd *ptr,那么获得用户名ptr->pw_name、密码ptr->pw_passwd、目录名(绝对路径名)ptr->pw_dir。

GID——>组名:struct group *getgrnam(文件名);struct group *getgruid(gid_t gid)。获得组名ptr->gr_name、密码ptr->gr_passwd。

获取软链接指向的文件名称:int readlink(软链接名称,字符串buf,大小size),将链接文件的指向文件的绝对路径保存到字符串buf中。成功则返回绝对路径的长度。如果路径长度超过字符串大小size,超过的内容将会被截断。

判断文件是否具有某种操作属性(读写):int access(文件名,执行权限mode),执行权限mode有:R_OK可读、W_OK可写、X_OK可执行、F_OK文件存在。如果符合判断,则返回0,如果有一个条件不满足,则返回-1。

测试文件类型:int isfdtype(文件描述符,文件类型)。如果是,则返回1,否则返回0,出错则返回-1。第二个参数——文件类型如下:

这些参数和一系列测试宏对应(不是真的对应,只是为了方便记忆:是这样的,这些参数的形状是S_IFXXX,而测试宏是S_ISXXX),如S_ISDIR(stat.st_mode),通过获得的文件属性stat的st_mode成员来测试这个文件是否为目录,如果是则返回1,否则返回0。

Linux文件管理的更多相关文章

  1. Linux文件管理相关命令

    Linux文件管理相关命令   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux文件管理背景知识之后, 我们可以 ...

  2. Linux文件管理上

    Linux文件管理   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 对于计算机来说,所谓的数据就是0和1的序列.这样的一个序列 ...

  3. Linux文件管理和编辑常用命令

    Linux文件管理和编辑常用命令 mkdir 命令 功能说明 mkdir 命令用于创建一个目录,mkdir是make directory的缩写 格式: mkdir [选项] 目录名 mkdir 命令的 ...

  4. 转 Linux文件管理

    Linux文件管理 http://www.cnblogs.com/vamei/archive/2012/09/09/2676792.html 作者:Vamei 出处:http://www.cnblog ...

  5. 3-2 LInux文件管理

    LInux文件管理 文件系统目录结构 Linux中目录结构是有一定的约定的FHS /bin:存放二进制程序 /boot:启动相关 /dev:设备文件 /etc:配置文件 /home:用户家目录 /li ...

  6. linux文件管理--压缩打包

    目录 linux文件管理--压缩打包 1.压缩打包介绍 2.gzip压缩工具 3.zip压缩工具 注意: 4.tar压缩工具 5.tar生产案例实践 linux文件管理--压缩打包 1.压缩打包介绍 ...

  7. day58:Linux:BashShell&linux文件管理&linux文件下载上传

    目录 1.BashShell 2.Linux文件管理 3.Linux文件下载和上传 BashShell 1.什么是BeshShell? 命令的解释,用来翻译用户输入的指令 2.BashShell能做什 ...

  8. 3-1 Linux文件管理类命令详解

    根据马哥Linux初级 03-01整理 1. 目录管理 ls cd pwd mkdir rmdir tree 2. 文件管理 touch stat file rm cp mv nano 3. 日期时间 ...

  9. Linux文件管理_1

    在Linux中,全部都是文件,所以文件管理在Linux上格外重要,在我们学习文件管理前,我们先学习几个关于文件的命令,之后才能更好的学习文件管理. 目录 pwd命令 cd命令 列出文件内容ls 查看文 ...

  10. linux文件管理之bash shell

    BASH Shell 对文件进行管理 ========================================================创建.复制.删除.移动.查看.编辑.压缩.查找 内 ...

随机推荐

  1. TortoiseGit:记住用户名和密码

    1.背景: 我们在使用 tortoisegit 工具时会无可避免的经常性 pull 和 push,这时通常要输入用户名和密码,由于麻烦,就有人提出了记住用户名和密码的需求... ... 2.设置: [ ...

  2. Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...

  3. JS魔法堂:不完全国际化&本地化手册 之 拓展篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  4. [Tool] Open Live Writer插件开发

    一 前言 Windows Live Writer(简称 WLW)开源之后变成 Open Live Writer(简称 OLW),原先 WLW 的插件在 OLW 下都不能用了,原因很简单,WLW 插件开 ...

  5. 从Google工程师到创业CTO,他的8项理念也许可以帮到你

    Lan Langworth是前Google软件工程师.O'Reily作者,现在他是Artillery的co-founder/CTO,致力于把游戏机质量的游戏带进网页浏览器.下文是他从Google离职到 ...

  6. ASP.NET用QQ,网易发送邮件以及添加附件

    教程:ASP.NET用QQ,网易发送邮件以及添加附件 这是我用QQ邮箱出现的异常: 命令顺序不正确. 服务器响应为:Error: need EHLO and AUTH first !无法从传输连接中读 ...

  7. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  8. spring笔记5 spring IOC的基础知识1

    1,ioc的概念 Inverse of control ,控制反转,实际的意义是调用类对接口实现类的依赖,反转给第三方的容器管理,从而实现松散耦合: ioc的实现方式有三种,属性注入,构造函数注入,接 ...

  9. 如何写出安全的API接口?接口参数加密签名设计思路

    开发中经常用到接口,尤其是在面向服务的soa架构中,数据交互全是用的接口. 几年以前我认为,我写个接口,不向任何人告知我的接口地址,我的接口就是安全的,现在回想真是too young,too simp ...

  10. 初识Servlet

    1.创建DispatcherServlet package myservlet; import java.io.IOException; import javax.servlet.ServletExc ...