ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 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位整数)参数说明 ![](https://img.kancloud.cn/35/91/359168711b79fb3ce1f4aa99b48cf890_644x611.png) 文件类型判断应使用宏函数 ![](https://img.kancloud.cn/2b/e1/2be154f79d9766da6ddd87af09bc1a5a_335x234.png) ~~~ int main() { int ret = -1; struct stat buf; ret = stat("a.txt", &buf); if (-1 == ret) { perror("stat"); return 1; } ​ if (S_ISREG(buf.st_mode)) { printf("%s\n", "这是普通文件"); } ​ return 0; } ~~~ ~~~ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> //查看文件信息命令 //$ stat txt //获取文件相关信息 int main(int argc, char **argv) { int ret = -1; struct stat buf; if (2 != argc) { printf("usage: ./a.out filename\n"); return 1; } memset(&buf, 0, sizeof(buf)); //获取文件相关信息 ret = stat(argv[1], &buf); if (-1 == ret) { perror("stat"); return 1; } printf("st_dev: %lu\n", buf.st_dev); printf("st_ino: %lu\n", buf.st_ino); printf("st_nlink: %lu\n", buf.st_nlink); printf("st_uid: %d\n", buf.st_uid); printf("st_gid: %d\n", buf.st_gid); printf("st_rdev:%lu\n", buf.st_rdev); printf("st_size: %ld\n", buf.st_size); printf("st_blksize: %ld\n", buf.st_blksize); printf("st_blocks: %ld\n", buf.st_blocks); #if 0 switch((buf.st_mode & S_IFMT)) { case S_IFSOCK: printf("socket\n"); break; case S_IFLNK : printf("symbolic link\n"); break; case S_IFREG : printf("regular file\n"); break; case S_IFBLK : printf("block device\n"); break; case S_IFDIR : printf("directory\n"); break; case S_IFCHR : printf("character device\n"); break; case S_IFIFO : printf("FIFO\n"); break; defalt: printf("未知类型....\n"); } #else if (S_ISREG(buf.st_mode) ) printf("is it a regular file \n"); if (S_ISDIR(buf.st_mode) ) printf("directory \n"); if (S_ISCHR(buf.st_mode) ) printf("character device \n"); if (S_ISBLK(buf.st_mode) ) printf("block device \n"); if (S_ISFIFO(buf.st_mode)) printf("FIFO (named pipe) \n"); if (S_ISLNK(buf.st_mode) ) printf("symbolic link \n"); if (S_ISSOCK(buf.st_mode)) printf("socket \n"); #endif //判断文件所属者权限 if (buf.st_mode & S_IRUSR) printf("r"); else printf("-"); buf.st_mode & S_IWUSR ? printf("w") : printf("-"); buf.st_mode & S_IXUSR ? printf("x") : printf("-"); //判断文件所属组权限 buf.st_mode & S_IRGRP ? printf("r") : printf("-"); buf.st_mode & S_IWGRP ? printf("w") : printf("-"); buf.st_mode & S_IXGRP ? printf("x") : printf("-"); //判断文件其它权限 buf.st_mode & S_IROTH ? printf("r") : printf("-"); buf.st_mode & S_IWOTH ? printf("w") : printf("-"); buf.st_mode & S_IXOTH ? printf("x") : printf("-"); printf("\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进制数) 返回值: 成功: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 ~~~