文件操作相关函数
stat/fstat/lstat函数:
int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);
获取文件状态信息;
区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。
struct stat结构体:
c
struct stat {
dev_t st_dev; /* [XSI] ID of device containing file */ // 文件的设备编号
ino_t st_ino; /* [XSI] File serial number */ // inode节点
mode_t st_mode; /* [XSI] Mode of file (see below) */ // 文件的类型和存取的权限
nlink_t st_nlink; /* [XSI] Number of hard links */
uid_t st_uid; /* [XSI] User ID of the file */ // 用户ID
gid_t st_gid; /* [XSI] Group ID of the file */ // 组ID
dev_t st_rdev; /* [XSI] Device ID */
struct timespec st_atimespec; /* time of last access */ // 最后一次访问时间
struct timespec st_mtimespec; /* time of last data modification */ // 最后一次修改时间
struct timespec st_ctimespec; /* time of last status change */ // 最后一次改变时间(指属性)
off_t st_size; /* [XSI] file size, in bytes */ // 文件字节数(文件大小)
blkcnt_t st_blocks; /* [XSI] blocks allocated for file */
blksize_t st_blksize; /* [XSI] optimal blocksize for I/O */
__uint32_t st_flags; /* user defined flags for file */
__uint32_t st_gen; /* file generation number */
__int32_t st_lspare; /* RESERVED: DO NOT USE! */
__int64_t st_qspare[2]; /* RESERVED: DO NOT USE! */
};
stat_demo.c
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
// int stat(const char *pathname, struct stat *buf);
struct stat xixi;
int ret = stat("xixi.txt", &xixi);
int file_type = S_IFMT & xixi.st_mode;
// file type
printf(" file type ~~~~~~~~\n");
switch (file_type) {
{
case S_IFIFO:
printf("xixi is fifo file\n");
break;
case S_IFCHR:
printf("xixi is char file\n");
break;
case S_IFDIR:
printf("xixi is dir file\n");
break;
case S_IFBLK:
printf("xixi is block file\n");
break;
case S_IFREG:
printf("xixi is regular file\n");
break;
case S_IFLNK:
printf("xixi is symbolic link file\n");
break;
case S_IFSOCK:
printf("xixi is socket file\n");
break;
}
}
// 直接判断
// S_ISBLK(xixi.st_mode) // 是否是块文件
// S_ISCHR(xixi.st_mode) // 是否是字符文件
// S_ISDIR(xixi.st_mode) // 是否是目录文件
// S_ISFIFO(xixi.st_mode) // 是否是管道文件
// S_ISREG(xixi.st_mode) // 是否是普通文件
// S_ISLNK(xixi.st_mode) // 是否是链接文件
// S_ISSOCK(xixi.st_mode) // 是否是socket文件
// owner
printf(" for owner ~~~~~~~~\n");
int own_r = S_IRUSR & xixi.st_mode;
if (own_r == S_IRUSR) {
printf("owner has read permission\n");
} else {
printf("owner has not read permission\n");
}
int own_w = S_IWUSR & xixi.st_mode;
if (own_w == S_IWUSR) {
printf("owner has write permission\n");
} else {
printf("owner has not write permission\n");
}
int own_x = S_IXUSR & xixi.st_mode;
if (own_x == S_IXUSR) {
printf("owner has execute permission\n");
} else {
printf("owner has not execute permission\n");
}
// group
printf(" for group ~~~~~~~~\n");
int group_r = S_IRGRP & xixi.st_mode;
if (group_r == S_IRGRP) {
printf("group has read permission\n");
} else {
printf("group has not read permission\n");
}
int group_w = S_IWGRP & xixi.st_mode;
if (group_w == S_IWGRP) {
printf("group has write permission\n");
} else {
printf("group has not write permission\n");
}
int group_x = S_IXGRP & xixi.st_mode;
if (group_x == S_IXGRP) {
printf("group has execute permission\n");
} else {
printf("group has not execute permission\n");
}
// other
int other_r = S_IROTH & xixi.st_mode;
if (other_r == S_IROTH) {
printf("other has read permission\n");
} else {
printf("other has not read permission\n");
}
int other_w = S_IWOTH & xixi.st_mode;
if (other_w == S_IWOTH) {
printf("other has write permission\n");
} else {
printf("other has not write permission\n");
}
int other_x = S_IXOTH & xixi.st_mode;
if (other_x == S_IXOTH) {
printf("other has execute permission\n");
} else {
printf("other has not execute permission\n");
}
printf("file size = %lld\n", xixi.st_size);
return 0;
}
access函数:
int access(const char *pathname, int mode);
测试指定文件是否具有某种属性
- R_OK:文件是否read权限
- W_OK:文件是否有write权限
- X_OK:文件是否有execute权限
- F_OK:测试文件是否存在
c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
// file exists
int ret = access("xixi.txt", F_OK);
if (ret == 0) {
printf("file exists\n");
} else {
printf("file does not exists\n");
}
// check read and write permission
ret = access("xixi.txt", R_OK | W_OK);
if (ret == 0) {
printf("xixi.txt has read and write permission\n");
} else {
printf("xixi.txt has not read and write permission\n");
}
return 0;
}
chmod/chown函数:
修改mode和owner
int chmod(const char *pathname, mode_t mode);
int chown(const char *pathname, uid_t owner, gid_t group);
truncate/ftruncate函数:
int truncate(const char *path, off_t length);
通过路径名修改文件大小int ftruncate(int fd, off_t length);
通过文件描述符修改文件大小
link/symlink/readlink/unlink函数:
int link(const char *oldpath, const char *newpath);
创建一个硬链接int symlink(const char *target, const char *linkpath);
创建一个软链接ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
读软连接对应的文件名int unlink(const char *pathname);
删除一个文件(软硬链接文件)
mkdir/mkdirat/rmdir函数:
int mkdir(const char *pathname, mode_t mode);
创建目录int rmdir(const char *pathname);
删除目录
opendir/readdir/closedir函数
DIR *opendir(const char *name);
int readdir(unsigned int fd, struct old_linux_dirent *dirp, unsigned int count);
int closedir(DIR *dirp);
chdir/fchdir/getcwd函数:
int chdir(const char *path);
修改目录int fchdir(int fd);
修改目录char *getcwd(char *buf, size_t size);
获取当前工作目录