雅思考试小白入门指南
2019-06-25
更新时间:2026 02 18 05:25:54作者:佚名
各位老铁们好,相信很多人对Linux文件系统操作中关键函数详解都不是特别的了解,因此呢,今天就来为大家分享下关于Linux文件系统操作中关键函数详解以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
int open(const char *pathname, int flags);//pathname 文件名(path);标志打开模式,包括O_RDONLY、O_WRONLY、O_RDWR
int open(const char *pathname, int flags, mode_t mode);//该函数一般用于创建新文件,flags加O_CREAT,如:O_RDWR|O_CREAT
int creat(const char *pathname, mode_t mode);//创建一个新文件,mode权限描述,如0644(八进制,取反并与umask进行AND运算,得到真实结果)
返回值:成功则返回文件描述符fd,失败则返回-1。
例子:
int fd=open('test.txt', O_WRONLY);//以只写模式打开test.txt并返回文件描述符
附:文件描述符说明(32位机器上文件描述符范围为0到1023):0代表标准输入,1代表输出,2代表错误;我们的程序从3开始,并且每次总是使用最小的一个。
2.read文件读取(man 2 write视图)
ssize_t read(int fd, void *buf, size_t count);//ssize_t 有符号整数; fd 文件描述符; buf传出参数,读取的内容在buf中; count代表buf的长度
返回值:大于0表示读取的字节数,等于0表示读取完成,-1表示读取失败
3.write文件写入(man 2 write视图)
ssize_t write(int fd, const void *buf, size_t count);//buf中需要写入的内容,count中需要写入的内容的长度; ssize_t 有符号整数; size_t 无符号整数
返回值:大于写入的字节数,0表示没有写入数据,-1表示写入失败
4、lseek移动文件指针(man 2 lseek查看)
off_t lseek(int fd, off_t offset, int wherece); //fd文件描述符,offset移动偏移量,从哪里移动参考点
whence有三个值:SEEK_SET文件起始位置、SEEK_CUR表示指针当前位置、SEEK_END文件结束位置。
返回值:大于等于0表示距文件开头的偏移量,-1表示失败
附:该函数可用于扩展,如lseek(fd,100,SEEK_END);表示扩容100字节,但扩容需要写操作才能生效。
5. stat 获取文件信息(man 2 stat 查看)
int stat(const char *path, struct stat *buf);//path 文件路径; buf传出参数,获取到的文件信息在buf中
int fstat(int fd, struct stat *buf);//fd文件描述符
int lstat(const char *path, struct stat *buf);//lstat和stat的区别仅在于符号链接文件。 lstat读取符号链接文件,stat读取符号链接对应的源文件。
返回值:成功返回0;失败时返回-1。
附:下面解释struct stat结构体的组成
dev_t st_dev; /* 包含文件设备ID的设备ID*/
ino_t st_ino; /* inode编号inode节点*/
mode_t st_mode; /* 保护文件类型和访问权限等(该字段非常重要,该字段的详细说明请参见man文档)*/
nlink_t st_nlink; /* 硬链接数量硬链接数量*/
uid_t st_uid; /* 所有者用户ID的用户ID*/
gid_t st_gid; /* 所有者组ID的组ID*/
dev_t st_rdev; /* 设备ID(如果是特殊文件) 如果该文件是设备文件,则其设备号*/
off_t st_size; /* Total Size, in bytes 文件的字节数,即文件大小*/
blksize_t st_blksize; /* blocksize为文件系统I/O块大小,即文件系统的I/O缓冲区大小*/
blkcnt_t st_blocks; /* 分配块的512B块数*/
time_t st_atime; /* 最后访问时间最后访问时间*/
time_t st_mtime; /* 最后修改时间最后修改时间*/
time_t st_ctime; /* 最后状态改变时间最后改变时间*/
结构体struct stat的st_mode说明:
.check the file type using the st_mode field://使用st_mode检查文件类型的宏定义如下
S_ISREG//普通文件(m)是普通文件吗?
S_ISDIR//Directory(m)目录?
S_ISCHR//字符设备(m)字符设备?
S_ISBLK//块设备(m)块设备?
S_ISFIFO//Pipe(m) FIFO(命名管道)?
S_ISLNK//符号链接(m)符号链接? (不在POSIX.1-1996 中。)
S_ISSOCK//Socket(m)套接字? (不在POSIX.1-1996 中。)
例子:
switch (sb.st_mode S_IFMT){ //S_IFMT是文件类型掩码,其值为八进制170000
附:S_IRWXU 文件所有者权限掩码,其值为00700; S_IRWXG 组权限掩码,其值为00070; S_IRWXO 他人的权限掩码,其值为00007;详细信息请参阅man 手册。用法是一样的,以S_IRWXU为例,如下:
6.access检查文件权限(man 2 access查看)
int access(const char *pathname, int mode);//pathname 文件名,mode 权限
返回值:所有权限都允许则返回0;只要有一个权限不允许就返回-1,出错也返回-1;
模式值说明:
如果不是F_OK:表示文件是否存在
如果不是R_OK | W_OK |
7. chmod 更改文件权限
int chmod(const char *path, mode_t mode);//path 文件路径; mode_t 整数,模式权限,必须是八进制数,或者使用预定义的宏,具体参见man手册
int fchmod(int fd, mode_t mode);//fd文件描述符
返回值:成功返回0;失败时返回-1。
8. chown更改文件所有者(一般需要root权限才能操作成功)
int chown(const char *path, uid_t Owner, gid_t group);//穿透符号链接;文件路径
int fchown(int fd, uid_t Owner, gid_t group);//直接文件操作; fd 文件描述符
int lchown(const char *path, uid_t Owner, gid_t group);//不穿透符号链接;文件路径
返回值:成功返回0;失败时返回-1。
9. truncate 将文件更改为指定长度
int truncate(const char *path, off_t length);//path文件路径,必须有写权限; length 文件长度,单位字节数
int ftruncate(int fd, off_t length);//fd文件描述符,该文件必须打开
返回值:成功返回0;失败时返回-1。
附:该函数可用于文件扩展,不需要一次写入即可生效; lseek函数扩展需要编写一次才能生效。
10. link创建硬链接
int link(const char *oldpath, const char *newpath);//oldpath源文件,newpath为要创建的硬链接的路径
返回值:成功返回0;失败时返回-1。
11. symlink 创建软链接
int symlink(const char *oldpath, const char *newpath);//oldpath源文件路径,newpath软链接路径
返回值:成功返回0;失败时返回-1。
12.readlink读取软链接对应的文件名(不是源文件的内容)
ssize_t readlink(const char *path, char *buf, size_t buf-siz);//path 软链接路径; buf传出参数,buf-siz为buf的长度;读取的内容在buf中
返回值:成功返回读取内容的长度,失败返回-1。
13. unlink 删除链接
如果是符号链接,则删除该符号链接;
如果是硬链接,则硬链接数量减1;当减为0时,释放数据块和Inode;
附:如果硬链接数为0,但有进程占用该文件,则必须等待该进程关闭该文件后,才能真正删除该文件。您可以使用此功能来创建临时文件。
首先打开或创建文件,然后取消链接。这样,当进程关闭文件或者进程退出时,文件就会被自动删除。
int unlink(const char *pathname);//pathname 文件路径
返回值:成功返回0;失败时返回-1。
14. 重命名文件重命名
int rename(const char *oldpath, const char *newpath);//oldpath原文件,newpath新文件
返回值:成功返回0;失败时返回-1。
15、fcntl操作文件描述符(内存:文件控制)
int fcntl(int fd, int cmd, /* arg */);//fd 文件描述符; cmd命令;第三个是可变参数,可选
返回值:成功返回大于等于0,根据cmd的值返回不同含义;失败返回-1。
例子:
根据功能分类确定cmd的值:
2.获取或设置文件描述符标记,cmd为F_GETFD、F_SETFD
3.获取或设置文件状态标志,cmd为F_GETFL、F_SETFL
4.获取或设置锁,cmd为F_SETLK、F_SETLKW、F_GETLK
5.获取或设置异步IO所有权,cmd为F_GETOWN、F_SETOWN、F_GETSIG、F_SETSIG
6.lease、文件和目录变更通知等,详细请查看man手册。
int dup(int oldfd);//旧文件描述符
int dup2(int oldfd, int newfd);//oldfd旧文件描述符,newfd新文件描述符
返回值:成功则返回新的文件描述符,失败则返回-1。
答: 在 Linux 系统中,有很多常用函数可以帮助我们进行文件操作。比如,想要创建新的文件可以使用 "open()" 函数,想要读取文件的内容则可以用 "read()" 函数,而想要改写文件内容可用 "write()" 函数。如果想删除一个文件,可以使用 "close()" 函数来释放文件资源,以及 "unlink()" 函数来真正删除文件。此外,还有许多其他函数可以用来检查文件属性、改变文件权限等等。
221 人赞同了该回答
答: 实际上,Linux 文件操作主要分为创建、读取、修改和删除四个方面。每个方面都有相应的系统函数支持。比如,如果想查看文件是否存在,可以使用 "access()" 函数来判断;如果想获取文件的尺寸大小,可以使用 "stat()" 函数;想要将文件移动到其他目录,可以使用 "rename()" 函数等等。
65 人赞同了该回答
答: 要创建新的文本文件,你需要使用 "open()" 函数。首先,需要指定文件路径和操作模式,比如“w”表示写模式,用于新建文件或覆盖已有文件内容。然后,"open()" 函数会返回一个文件描述符,你可以使用这个描述符来操作该文件。记得在完成操作后,用 "close()" 函数关闭文件描述符释放资源。
117 人赞同了该回答
答: 除此之外,也可以使用高层接口函数,比如 C++ 的“ofstream”对象来创建文本文件。这种方法更加简便易懂,并且能够处理一些更复杂的文本格式操作,例如文件编码、缓冲区管理等。
277 人赞同了该回答