Linux文件操作学习总结【转载】
本文转载自: http://blog.csdn.net/xiaoweibeibei/article/details/6556951
文件类型:普通文件(文本文件,二进制文件)、目录文件、链接文件、设备文件、管道文件。
文件的权限:读、写、执行
文件的相关信息:目录结构、索引节点、文件数据
索引节点的stat结构
struct stat{
dev_t st_dev;//文件使用的设备号
ino_t st_inl;//索引节点号
mode_t st_mode;//文件访问权限
nlink_t st_nlink;//文件的硬链接数
uid_t st_uid;//所用者用户识别号
gid_t st_gid;//组识别号
dev_t st_rdev;//设备文件的设备号
off_t st_size;//以字节为单位的文件容量
unsigned long st_blksize;//包含该文件的磁盘块的大小
unsigned long st_blocks;//文件所占的磁盘块
time_t st_atime;//最后一次访问该文件的时间
time_t st_mtime;//最后一次修改该文件的时间
time_t st_ctime;//最后一次改变该文件状态的时间
} ;
在该结构体中,st_dev对应于每一个文件名,代表包含这个文件名和相应的索引节点的文件系统的设备号,st_rdev则只有字符设备和快设备具有,表示的是实际设备的设备号
文件操作相关函数
文件创建
函数:int creat(const char *pathname,mode_t mode);
头文件:sys/types.h sys/stat.h fcntl.h
说明:
mode取值如下:
|
mode取值 |
含义 |
|
S_IRUSR |
文件所有者的读权限 |
|
S_IWUSR |
文件安所有者的写权限 |
|
S_IXUSR |
文件所有者的执行权限 |
|
S_IRGRP |
文件所有者同组用户的读权限 |
|
S_IWGRP |
文件所有者同组用户的写权限 |
|
S_IXGRP |
文件所有者同组用户的执行权限 |
|
S_IROTH |
其他用户的读权限 |
|
S_IWOTH |
其他用户的写权限 |
|
S_IXOTH |
其他用户的执行权限 |
Linux系统中还定义了几个权限组合:
S_IRWXU =(S_IRUSR|S_IWUSR|S_IXUSR)
S_IRWXG =(S_IWGRP|S_IWGRP|S_IXGRP)
S_IRWXO=(S_IROTH|S_IWOTH|S_IXOTH)
当调用成功时,返回该文件的描述符,失败返回-1,此时文件以只读方式打开。
文件打开
函数:(1) int open( const char *pathname,int flags);
(2)int open(const char *pathname,int flags,mode_t mode);
头文件:sys/types.h sys/stat.h fcntl.h
说明:flags用于描述文件打开参数,通过按位逻辑加得到,其中O_RDONLY,O_WRONLY和O_RDWR,3个值必需包含其中一种。flags取值如下:
|
flags取值 |
含义 |
|
O_RDONLY |
以只读方式打开 |
|
O_WRONLY |
以只写方式打开 |
|
O_RDWR |
以读写方式打开 |
|
O_CREAT |
若所打开文件不存在,则创建此文件 |
|
O_EXCL |
若打开文件时设置了O_CREAT位且该文件存在,则导致失败 |
|
O_NOCTTY |
若在打开tty时进程没有控制tty则不控制终端 |
|
O_TRUNC |
若以只写或读写方式打开一个已存在文件时,将该文件截至0 |
|
O_APPEND |
以追加的方式打开,将文件添加内容时将指针置于文件末尾 |
|
O_NONBLOCK |
用于非阻塞接口I/O,若操作不能无延迟的完成,则在操作前返回 |
|
O_NODELAY |
同O_NONBLACK |
|
O_SYNC |
只在数据被写入外存或其他设备之后才返回 |
当调用成功时,返回要打开文件的描述符,调用失败返回-1,并置errno为相应错误号。
文件关闭
函数:int close(int fd);
头文件:unistd.h
说明:
成功时返回0,失败时返回-1,并置errno为EBADF.当打开一个文件是,该文件描述中的引用计数加1,关闭一个文件时,该文件的引用计数减1,当引用计数为0时,close调用不仅释放该文件的描述符,还将释放该文件所占的描述表项。
文件写操作
函数:ssize_t write(int fd,void *buf,size_t count);
头文件:unistd.h
说明: 调用成功返回所写入段字节数,失败返回-1 ,并设置相应的errno。
文件读操作
函数:ssize_t read(int fd ,void *buf,size_t count);
头文件:unistd.h
说明:调用成功返回所读取的字节数,失败返回-1,并设置相应的errno。
文件定位操作
函数:off_t lseek(int fildes.off_t offset,int whence);
头文件:unistd.h
说明:调用成功返回相对于文件开头的实际偏移量,失败返回-1,并设置相应errno。whence取值如下:
|
Whence取值 |
含义 |
|
SEEK_SET |
从文件开头计算偏移量; |
|
SEEK_CUR |
从当前位置计算偏移量; |
|
SEEK_END |
从文件的末尾计算偏移量 |
文件属性修改
函数:(1) int chown(const char *pathname,uid_t owner,gid_t group);
(2) int fchown(int fd,uid_t owner,gid_t group);
头文件:sys/types.h unistd.h
说明:改变文件的所有者,由于涉及权限问题,只有root用户可以调用chown和fchown来任意改变一个文件的所有者及所属的组,普通用户没有这个权限,普通用户只能修改自己所有的文件的组识别号,切只能在其所属的组中进行选择。
函数:(1)int chmod(char *pathname,mode_t mode);
(2)int fchmod(int fd,mode_t mode;
头文件:sys/types.h unistd.h
说明: 改变文件的访问权限,关于权限的设置和chmod命令类似,调用成功返回0,失败返回-1,并设置errno。
文件重命名
函数:int rename( const char *oldname,const char *newname);
头文件:stdio.h
说明:当newname和oldname指向相同,则rename调用不做任何操作成功返回。
|
oldname指向 |
newname指向文件不存在 |
newname指向普通文件 |
newname指向目录文件 |
|
oldname指向普通文件 |
文件被重命名 |
文件重命名 |
错误返回 |
|
oldname指向目录文件 |
文件重命名 |
错误 |
newname所指向的目录文件为空目录则该目录被删除,oldname被重新命名,否则出错返回 |
dup和dup2调用
函数:(1)int dup(int fd); (2) int dup2( int fd,int fd2);
头文件:unistd.h
说明:该调用都将复制文件描述符,两个调用成功执行时都将返回新得到的文件描述符,其区别在于(2)可以预先制定文件描述符fd2,如果fd2正在被使用,则先关闭fd2,如果fd2和fd相同,则不关闭该文件正常返回;
stat、fstat和lstat调用
函数:(1) int stat(const char *pathname,struct stat *sbuf);
(2) int fstat(int fd,struct stat *sbuf);
(3) int lstat(const char *pathname,struct stat*buf);
头文件:sys/types.h sys/stat.h unistd.h
说明:对于lstat而言,当访问一个符号链接时,lstat只返回链接本身的信息,而stat和fstat将追踪到链接的末端文件,也就是所连接的文件。
fsync调用
函数:int fsync(int fd);
头文件:unistd.h
说明:将保存在缓冲区内的要写入文件描述符fd的所有数据刷新到要写入的文件中,当调用成功返回0,调用失败返回-1,并设置errno。
flock调用
函数:int flock(int fd,int operation);
头文件:sys/types.h
说明:将文件描述符所对应的文件加锁或解锁,operation用于表示不同的上锁或解锁方式,取值如下:
LOCK_SH:共享锁 LOCK_EX:独占锁 LOCK_UN:解锁
一个进程对一个文件只能有一个独占锁,但可以有多个共享锁,如果一个进程不试图去锁一个已经被上锁的文件,就不可以对其访问。当调用成功时返回0,失败时返回-1。
fcntl调用
函数:(1) int fcntl(int fd,int cmd);
(2) int fcntl(int fd,int cmd,long arg);
头文件:unistd.h fcntl.h
说明:参数arg为可选参数,对应于cmd的某些可取值,对应于执行某些特殊操作;调用成功时返回0,失败是返回-1,并设置errno,此外,fcntl调用能完成的大部分操作都可以用其他调用来完成。cmd的取值如下:
|
cmd取值 |
相应操作 |
|
F_DUPFD |
复制文件描述符 |
|
F_GETFD |
获取文件描述符 |
|
F_SETFD |
设置close-on-exec标志 |
|
F_GETFL |
获取open调用设置的标志 |
|
F_SETFL |
设置open调用设置的标志 |
|
F_GETLK |
获取离散的文件锁 |
|
F_SETLK |
设置获得离散的文件锁,不等待 |
|
F_SETLKW |
设置获得离散的文件锁,必要时等待 |
|
F_GETOWN |
检索将收到SIGIO和SIGURG信号灯进程id或进程组号 |
|
F_SETOWN |
设置进程id或进程组号 |
特殊文件操作
创建目录
函数:int mkdir(const char *pathname,mde_t mode);
头文件:sys/types.h sys/stat.h
说明:mode的值与表示其权限,mode的值由当前的umask的值得反值与设置的mode相与确定,该目录的所有者为调用mkdir创建它的进程的有效用户标识号。调用成功返回0,失败返回-1,并设置errno。
删除目录
函数:int rmdir(const char *pathname);
头文件:unistd.h
说明:当目录为空时,调用此函数可以将其删除,否则将删除失败。调用成功返回0,失败返回-1,并设置errno。
打开目录
函数:DIR * opendir(const char *pathname);
头文件: sys/types.h dirent.h
说明:调用返回值为DIR类型,用于指向目录文件的结构指针。调用成功返回目录指针,调用失败返回NULL。
关闭目录
函数:int closedir( DIR *dp);
头文件:sys/types.h dirent.h
说明:参数为要关闭的目录文件指针,该指针有opendir返回,调用成功返回0,失败返回-1,并设置errno。
读取目录
函数:struct dirent * readdir(DIP *dp);
头文件:sys/types.h dirent.h
说明:用于访问目录指针dp的目录文件,其返回值为dirent结构体指针,dirent结构如下:
struct drent{
ino_t d_ino;//目录节点号
off_t d_off;//节点偏移量
unsigned short d_reclen;//记录长度
unsigned char d_type;//文件类型
char d_name[256];//目录链接的文件名
}
当目录中没有更多链接时,返回0。
创建硬链接
函数:int link(char *pathname1,char *pathname2);
头文件:unistd.h
说明:pathname1为已经存在的文件,pathname2为要建立的链接,pathname1和pathname2之西那个的路径必须在同一个文件系统中,只用超级用户才能创建一个指向目录文件的新的连接文件。调用成功返回0,失败返回-1。
移除硬链接
函数:int unlink(char *pathname);
头文件:unistd.h
说明:要移除一个文件的链接,必须要有对该目录的写权限和执行权限,当调用unlink时,目录的索引节点计数将减1,当链接计算器为0时,索引节点和文件数据块将被释放。
创建符号链接
函数:int symlink(const char *actualpath,const char *sympath);
头文件:unistd.h
说明:acturalpath为真实存在的文件,sympath为新创建的指向acturalpath的符号链接,调用成功返回0,失败返回-1,并设置errno。
打开链接
函数:int readlink(const char *pathname, char *buf,int bufsize);
头文件:unistd.h
说明:调用成功时,返回值为写入缓冲区的字节数,调用失败时,返回值为0,并设置errno。
Linux文件操作学习总结【转载】的更多相关文章
- C/C++以及Linux文件操作备忘录
目录 C文件操作 文件开关 文件读写 C++文件操作 Linux文件操作 打开 C文件操作 #include<stdio.h> stdin, stdout, stderr 文件开关 /* ...
- Linux 文件操作接口
目录 Linux 文件操作接口 C语言文件操作接口 C语言文件描述 fopen() r模式打开文件 w模式打开文件 a模式打开文件 其他模式类似 fclose() fwrite() fread() 系 ...
- Linux文件操作的主要接口API及相关细节
操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ...
- Linux 文件操作监控inotify功能及实现原理【转】
转自:http://blog.chinaunix.net/uid-26585427-id-5012973.html 1. inotify主要功能 它是一个内核用于通知用户空间程序文件系统变化的机制. ...
- Linux 文件操作总结
http://blog.163.com/he_junwei/blog/static/19793764620152592737741/ ioctl?? lseek?? 文件是linux中的一个重要概念. ...
- Linux 文件操作——系统调用和标准I/O库
一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等 ...
- linux 文件操作与目录操作
文件操作 使用命令 命令格式: 命令 [选项] [参数] [] 表示可选的 示例: ls -a /etc 常识命令 ls:查看指定目录的内容,不指定目录时查看当前工作目录 选项 说明 -a 显示所有文 ...
- Linux文件操作常用命令整理
收集.整理日常系统管理或维护当中的,常用到的一些关于文件操作的命令或需求,后续会慢慢补充.完善! 查看.生成指定目录的目录树结构? [root@DB-Server ~]#tree #当前目录 ...
- PHP 文件操作类(转载)
<?php class File { /** * 创建多级目录 * @param string $dir * @param int $mode * @return boolean */ publ ...
随机推荐
- 《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析
本节和<Android群英传>中的第七章Android动画机制与使用技巧有关系,建议先阅读该章的总结 第7章 Android动画深入分析 7.1 View动画 (1)android动画分为 ...
- 将从网上下载下来的javaweb项目继续配置
1.将下载下来的项目,看有没有报错,这里推荐的是不变成web项目的方法,直接通过编译到服务器目录 2.报错的问题,一般是包,服务器的包,(tomcat-home)指向自己的bin目录 3.然后是添加s ...
- 注册表修改IP地址和DNS等信息
---------------------win8系统 1. 2. 3. --------------------------------------------------------------- ...
- 使用WebUploader使用,及使用后测试横拍或竖拍图片图片方向不对等解决方案
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览 ...
- Python局部变量和全局变量global
当你在函数定义声明变量的时候,它们与函数外具有相同名称的其它变量没有任何关系,即变量名称对于函数来说是 局部 的.这称为变量的 作用域 .所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开 ...
- Delphi ComboBox的属性和事件、及几个鼠标事件的触发
临时做了两个小的测试程序,为了彻底弄清楚combobox的OnClick.OnChange.OnDropDown.OnCloseUp.OnSelect事件的触发及其先后顺序. 另附常用鼠标事件的触发情 ...
- PHP简单计算器
工作之余,写着玩的. <?php $num1 = $_POST['num1']; $num2 = $_POST['num2']; $yusuan = $_POST['yusuan']; $jie ...
- 【COGS 56】质数取石子
[问题描述] DD 和 MM 正在玩取石子游戏.他们的游戏规则是这样的:桌上有若干石子,DD 先取,轮流取,每次必须取质数个.如果某一时刻某一方无法从桌上的石子中取质数个,比如说剩下 0 个或 1 个 ...
- asp.net使用Mysql乱码处理
在asp.net与mysql数据库打交道的时候,由于配置的问题,会遇到自己写的方法在读取数据库中数据的时候,英文,数字可以正常通过,但是中文就无法通过,以登录为例(方法略),当输入英文用户名的时候可以 ...
- IOS快速开发之常量定义
---恢复内容开始--- 在IOS开发中,有一些方法常常需要用的,但是有很长的方法名,这造成了代码长,写起来累,我们可以通过宏定义了解决这些问题 比如说在代码布局的时候会遇上这样的问题,我们要获取上面 ...