stat函数(重要)
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *path, struct stat *buf); int lstat(const char *pathname, struct stat *buf); 功能: 获取文件状态信息 stat和lstat的区别: 当文件是一个符号链接时,lstat返回的是该符号链接本身的信息; 而stat返回的是该链接指向的文件的信息。 参数: path:文件名 buf:保存文件信息的结构体 返回值: 成功: 0 失败: -1
struct stat结构体说明:
struct stat { dev_t st_dev; //文件的设备编号 ino_t st_ino; //节点 mode_t st_mode; //文件的类型和存取的权限 nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1 uid_t st_uid; //用户ID gid_t st_gid; //组ID dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号 off_t st_size; //文件字节数(文件大小) blksize_t st_blksize; //块大小(文件系统的I/O 缓冲区大小) blkcnt_t st_blocks; //块数 time_t st_atime; //最后一次访问时间 time_t st_mtime; //最后一次修改时间 time_t st_ctime; //最后一次改变时间(指属性) };
st_mode(16位整数)参数说明
举个应用bit--文件类型的例子:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
//复杂版本
int show_file_type(struct stat *s){
#include <sys/stat.h>
switch (s->st_mode & S_IFMT)
{
case __S_IFREG:
printf("普通文件\n");
break;
case __S_IFDIR:
printf("目录文件\n");
break;
case __S_IFCHR:
printf("字符设备文件\n");
break;
case __S_IFBLK:
printf("块设备文件\n");
break;
case __S_IFIFO:
printf("FIFO文件\n");
break;
case __S_IFLNK:
printf("符号链接文件\n");
break;
case __S_IFSOCK:
printf("套接字文件\n");
break;
default:
printf("未知文件类型\n");
break;
}
return 0;
}
int main(int argc,char **argv){
int ret = -1;
struct stat s;
//容错判断
if(argc != 2){
printf("Usage: %s <file>\n",argv[0]);
return 1;
}
//获取指定文件信息
ret = stat(argv[1],&s);
if(ret == -1){
perror("stat");
exit(1);
}
//显示文件类型q
show_file_type(&s);
}
文件类型判断应使用宏函数
测试
int main()
{
struct stat buf;
stat("a.txt", &buf);
//第二个简介版本
if (S_ISREG(buf.st_mode))
{
printf("%s\n", "这是普通文件");
}
return 0;
}
access函数
#include <unistd.h> int access(const char *pathname, int mode); 功能:测试指定文件是否具有某种属性 参数: pathname:文件名 mode:文件权限,4种权限 R_OK: 是否有读权限 W_OK: 是否有写权限 X_OK: 是否有执行权限 F_OK: 测试文件是否存在 返回值: 0: 有某种权限,或者文件存在 -1:没有,或文件不存在
access("txt", F_OK);
chmod函数
#include <sys/stat.h> int chmod(const char *pathname, mode_t mode); 功能:修改文件权限 参数: filename:文件名 mode:权限(8进制数) -7-可读可写可执行,-4-可读 返回值: 成功:0 失败:-1
chown函数
#include <unistd.h> int chown(const char *pathname, uid_t owner, gid_t group); 功能:修改文件所有者和所属组 参数: pathname:文件或目录名 owner:文件所有者id,通过查看 /etc/passwd 得到所有者id group:文件所属组id,通过查看 /etc/group 得到用户组id 返回值: 成功:0 失败:-1
truncate函数
#include <unistd.h> #include <sys/types.h> int truncate(const char *path, off_t length); 功能:修改文件大小 参数: path:文件文件名字 length:指定的文件大小 a)比原来小, 删掉后边的部分 b)比原来大, 向后拓展 返回值: 成功:0 失败:-1
link函数
#include <unistd.h> int link(const char *oldpath, const char *newpath); 功能:创建一个硬链接 参数: oldpath:源文件名字 newpath:硬链接名字 返回值: 成功:0 失败:-1
symlink函数
#include <unistd.h> int symlink(const char *target, const char *linkpath); 功能:创建一个软链接 参数: target:源文件名字 linkpath:软链接名字 返回值: 成功:0 失败:-1
readlink函数
#include <unistd.h> ssize_t readlink(const char *pathname, char *buf, size_t bufsiz); 功能:读软连接对应的文件名,不是读内容(该函数只能读软链接文件) 参数: pathname:软连接名 buf:存放软链接对应的文件名 bufsiz :缓冲区大小(第二个参数存放的最大字节数) 返回值: 成功:>0,读到buf中的字符个数 失败:-1
unlink函数
#include <unistd.h> int unlink(const char *pathname); 功能:删除一个文件(软硬链接文件) 参数: pathname:删除的文件名字 返回值: 成功:0 失败:-1
rename函数
#include <stdio.h> int rename(const char *oldpath, const char *newpath); 功能:把oldpath的文件名改为newpath 参数: oldpath:旧文件名 newpath:新文件名 返回值: 成功:0 失败:-1
文件描述符复制(重要)
dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个文件的描述符,使新的文件描述符也标识旧的文件描述符所标识的文件。
这个过程类似于现实生活中的配钥匙,钥匙相当于文件描述符,锁相当于文件,本来一个钥匙开一把锁,相当于,一个文件描述符对应一个文件,现在,我们去配钥匙,通过旧的钥匙复制了一把新的钥匙,这样的话,旧的钥匙和新的钥匙都能开启这把锁。
对比于 dup(), dup2() 也一样,通过原来的文件描述符复制出一个新的文件描述符,这样的话,原来的文件描述符和新的文件描述符都指向同一个文件,我们操作这两个文件描述符的任何一个,都能操作它所对应的文件。
dup函数
#include <unistd.h> int dup(int oldfd); 功能: 通过 oldfd 复制出一个新的文件描述符,新的文件描述符是调用进程文件描述符表中最小可用的文件描述符,最终 oldfd 和新的文件描述符都指向同一个文件。 参数: oldfd : 需要复制的文件描述符 oldfd 返回值: 成功:新文件描述符 失败: -1
dup2函数
#include <unistd.h> int dup2(int oldfd, int newfd); 功能: 通过 oldfd 复制出一个新的文件描述符 newfd,如果成功,newfd 和函数返回值是同一个返回值,最终 oldfd 和新的文件描述符 newfd 都指向同一个文件。 参数: oldfd : 需要复制的文件描述符 newfd : 新的文件描述符,这个描述符可以人为指定一个合法数字(0 - 1023),如果指定的数字已经被占用(和某个文件有关联),此函数会自动关闭 close() 断开这个数字和某个文件的关联,再来使用这个合法数字。 返回值: 成功:返回 newfd 失败:返回 -1
示例
fcnlt函数
#include <unistd.h> #include <fcntl.h> = int fcntl(int fd, int cmd, ... /* arg */); 功能:改变已打开的文件性质,fcntl针对描述符提供控制。 参数: fd:操作的文件描述符 cmd:操作方式 arg:针对cmd的值,fcntl能够接受第三个参数int arg。 返回值: 成功:返回某个其他值 失败:-1
fcntl函数有5种功能:
复制一个现有的描述符(cmd=F_DUPFD)
获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD)
获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)
获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
获得/设置记录锁(cmd=F_GETLK, F_SETLK或F_SETLKW)
示例
// 等价于dup() int new_fd = fcntl(fd, F_DUPFD, 0); // 获取文件状态标志 int flag = fcntl(fd, F_GETFL, 0); switch (flag & O_ACCMODE) { case O_RDONLY: printf("read only\n"); break; case O_WRONLY: printf("write only\n"); break; case O_RDWR: printf("read and write\n"); break; default: break; } if (flag & O_APPEND) { printf("append\n"); } flag |= O_APPEND; // 追加flag fcntl(fd, F_SETFL, flag); //设置文件状态标记
目录相关操作
getcwd函数
#include <unistd.h> char *getcwd(char *buf, size_t size); 功能:获取当前进程的工作目录 参数: buf : 缓冲区,存储当前的工作目录 size : 缓冲区大小 返回值: 成功:buf中保存当前进程工作目录位置 失败:NULL
chdir函数
#include <unistd.h> int chdir(const char *path); 功能:修改当前进程(应用程序)的路径 参数: path:切换的路径 返回值: 成功:0 失败:-1
opendir函数
#include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 功能:打开一个目录 参数: name:目录名 返回值: 成功:返回指向该目录结构体指针 失败:NULL
closedir函数
#include <sys/types.h> #include <dirent.h> int closedir(DIR *dirp); 功能:关闭目录 参数: dirp:opendir返回的指针 返回值: 成功:0 失败:-1
readdir函数
#include <dirent.h> struct dirent *readdir(DIR *dirp); 功能:读取目录 参数: dirp:opendir的返回值 返回值: 成功:目录结构体指针 失败:NULL
<dirent.h>说明
<dirent.h>
:该头文件提供了对目录及目录项的访问函数和数据结构的定义。它包含了用于打开、读取和关闭目录的函数,如 opendir()
、readdir()
、closedir()
,以及用于表示目录项的结构体 dirent
。
struct dirent { ino_t d_ino; // 此目录进入点的inode off_t d_off; // 目录文件开头至此目录进入点的位移 signed short int d_reclen; // d_name 的长度, 不包含NULL 字符 unsigned char d_type; // d_type 所指的文件类型 char d_name[256]; // 文件名 };
d_type文件类型说明:
取值 | 含义 |
---|---|
DT_BLK | 块设备 |
DT_CHR | 字符设备 |
DT_DIR | 目录 |
DT_LNK | 软链接 |
DT_FIFO | 管道 |
DT_REG | 普通文件 |
DT_SOCK | 套接字 |
DT_UNKNOWN | 未知 |
DIR是 <dirent.h>
头文件定义的一种的数据类型,一个不透明的指针类型,用于表示通过调用opendir()函数打开的目录,可以传递给readdir()和closedir()等目录操作函数
时间相关函数
char *asctime(const struct tm *tm); char *asctime_r(const struct tm *tm, char *buf); char *ctime(const time_t *timep); char *ctime_r(const time_t *timep, char *buf); struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime(const time_t *timep); struct tm *localtime_r(const time_t *timep, struct tm *result); time_t mktime(struct tm *tm);标签:文件,const,int,编程,C++,char,描述符,Linux,include From: https://blog.csdn.net/wang1664178416/article/details/139131845