Linux学习记录--文件操作系统编程
系统调用-文件操作
重要文件标识
打开文件标识
O_RDONLY:只读方式打开
O_WRONLY:只写方式打开
O_RDWR:可读写方式打开
打开文件操作副标识
O_CREAT:若路径中文件不存在则创建
O_EXCL:与O_CREAT连用,检查文件是否已经存在,若不存在则建立文件存在则返回错误
O_APPEND:读写文件从文件尾部开始移动,所有写入数据都加入文件尾部
O_TRUNC:若文件存在并且可以写入,此标识会将源文件内容清空
文件权限标志
S_IRUSR:用户读权限
S_IWUSR:用户写权限
S_IXUSR:用户执行权限
S_IRWX:用户读写执行权限
S_IRGRP:用户组读权限
S_IWGRP:用户组写权限
S_IXGRP:用户组执行权限
S_IRWXG:用户组读写执行权限
S_IROTH:其他用户读权限
S_IWOTH:其他用户写权限
S_IXOTH:其他用户执行权限
S_IRWXO:其他用户读写执行权限
S_ISUID :SUID权限
S_ISGID :SGID权限
重要函数
打开文件
open(文件路径,标识,权限标识)
文件路径:绝对路径与相对路径均可
标识:文件标识与操作副标识结合
权限标识:是使用权限标识,也可用数字法标识
创建文件
creat(文件路径, 权限标识)
open(文件路径, O_CREAT|标识,权限标识)
文件状态和属性
fstat(文件标识符,struct stat *buf)
lstat(文件路径,struct stat *buf)
stat(文件路径,struct stat *buf)
文件路径:绝对路径与相对路径均可
文件标识符:文件创建或打开时返回的文件标示符
structstat *buf:文件属性结构体
说明:stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息
stat 结构体成员意义
st_mode 文件权限和文件类型信息
st_ino 与该文件关联的inode
st_dev 保存文件的设备
st_uid 文件属主的UID号
st_gid 文件属主的GID号
st_atime 文件上一次被访问的时间
st_ctime 文件的权限、属主、组或内容上一次被修改的时间
st_mtime 文件的内容上一次被修改的时间。(和st_ctime的不同之处显而易见)
st_nlink 该文件上硬连接的个数
st_mode 标志
文件类型标志:
S_IFBLK:文件是一个特殊的块设备
S_IFDIR:文件是一个目录
S_IFCHR:文件是一个特殊的字符设备
S_IFIFO:文件是一个FIFO设备
S_IFREG:文件是一个普通文件(REG即使regular啦)
S_IFLNK:文件是一个符号链接
其他模式标志:
S_ISUID:文件设置了SUID位
S_ISGID:文件设置了SGID位
S_ISVTX:文件设置了sticky位
用于解释st_mode标志的掩码:
S_IFMT:文件类型
S_IRWXU:属主的读/写/执行权限,可以分成S_IXUSR,S_IRUSR, S_IWUSR
S_IRWXG:属组的读/写/执行权限,可以分成S_IXGRP,S_IRGRP, S_IWGRP
S_IRWXO:其他用户的读/写/执行权限,可以分为S_IXOTH,S_IROTH, S_IWOTH
确定文件类型
S_ISBLK:测试是否是特殊的块设备文件
S_ISCHR:测试是否是特殊的字符设备文件
S_ISDIR:测试是否是目录(我估计find .-type d的源代码实现中就用到了这个宏)
S_ISFIFO:测试是否是FIFO设备
S_ISREG:测试是否是普通文件
S_ISLNK:测试是否是符号链接
S_ISSOCK:测试是否是socket
目录操作
创建目录
mkdir(路径,权限)
路径:绝对路径相对路径均可
权限:以数字像是表示的权限
进入目录
chdir(路径)
子目录流操作
打开目录,获得子目录流指针
DIR*opendir(char *name)
读取子目录
structdirent* readdir((DIR *dirp)
返回子目录流里的当前位置
longint telldir(DIR* drip)
设置子目录流的当前数据项指针
voidseekdir(DIR* drip,long int loc)
关闭子目录流
DIR*opendir(DIR* drip)
删除目录或文件
删除目录:int rmdir(路径)
删除文件:int unlink(路径)
返回值-1 代表操作失败
综合例子
#include <fcntl.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <malloc.h> #include <string.h> #include <dirent.h> #include <stdlib.h> typedef enum { false = 0, true = 1 } bool; void printFileInfo(struct stat* buf) { bool userall = false; printf("文件权限是:%o. 详细信息如下:\n", (buf->st_mode & 0x0fff)); if (buf->st_mode & S_IRWXU) { userall = true; printf("所有者拥有读写执行权限\n"); } if (buf->st_mode & S_IRWXG) { printf("用户组拥有读写执行权限\n"); } if (buf->st_mode & S_IRWXO) { printf("其他人拥有读写执行权限\n"); } if (userall) { if (buf->st_mode & S_IRUSR) { printf("所有者拥有读权限\n"); } if (buf->st_mode & S_IWUSR) { printf("所有者拥有写权限\n"); } } if (buf->st_mode & S_IFREG) { printf("文件是一个普通文件\n"); } if (buf->st_mode & S_ISUID) { printf("文件设置了SUID权限\n"); } if (buf->st_mode & S_ISGID) { printf("文件设置了GUID权限\n"); } printf("UID=%d\n", buf->st_uid); printf("GID=%d\n", buf->st_gid); printf("占用block=%ld\n", buf->st_blocks); printf("block大小=%ld\n", buf->st_blksize); printf("最后访问时间=%ld\n", buf->st_atim.tv_sec); printf("最后状态更新时间=%ld\n", buf->st_ctim.tv_sec); printf("最后修改时间=%ld\n", buf->st_mtim.tv_sec); } int OpenFile(const char *fpath) { unlink(fpath); int f = open(fpath, O_RDWR); if (f == -1) { f = creat(fpath, S_IWUSR | S_IRUSR); if (f != -1) { printf("创建一个文件\n"); } else { printf("无法创建文件\n"); return -1; } } else { printf("文件打开成功\n"); } return f; } void scan_dir(const char* dir, int depth) { DIR *dp; struct dirent* entry; if ((dp = opendir(dir)) == NULL) { printf("无法打开目录:%s\n", dir); return; } struct stat statbuf; chdir(dir); while ((entry = readdir(dp)) != NULL) { const char* name = entry->d_name; lstat(name, &statbuf); if (S_IFDIR & statbuf.st_mode) { if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0) { continue; } printf("%*s%s:%o\n", depth, "", entry->d_name, (statbuf.st_mode & 0x0fff)); scan_dir(entry->d_name, depth + 4); } else { printf("%*s%s:%o\n", depth, "", entry->d_name, (statbuf.st_mode & 0x0fff)); } } chdir(".."); closedir(dp); } int main() { const char *fpath = "test"; int f = OpenFile(fpath); struct stat *buf = malloc(sizeof(struct stat)); fstat(f, buf); printf("===================================================\n"); printFileInfo(buf); printf("===================================================\n"); close(f); sleep(1); chmod("test", 7777); printf("更改文件权限为7777\n"); stat("test", buf); printf("===================================================\n"); printFileInfo(buf); printf("===================================================\n"); free(buf); printf("==================扫描文件夹============================\n"); scan_dir("/home/tkf", 0); umask(0011); if (mkdir("/tmp/mydir", 0777) != -1) { printf("目录创建成功\n"); } if (creat("/tmp/mydir/myfile", 0777) != -1) { printf("文件创建成功\n"); } printf("==================扫描文件夹==========================\n"); scan_dir("/tmp/mydir", 0); chdir("/tmp"); if (unlink("mydir/myfile") != -1) { printf("文件删除成功\n"); } if (rmdir("mydir") != -1) { printf("目录删除成功\n"); } return 0; }
执行结果
创建一个文件
===================================================
文件权限是:600.详细信息如下:
所有者拥有读写执行权限
所有者拥有读权限
所有者拥有写权限
文件是一个普通文件
UID=0
GID=0
占用block=8
block大小=4096
最后访问时间=1397539372
最后状态更新时间=1397539372
最后修改时间=1397539372
===================================================
更改文件权限为7777
===================================================
文件权限是:7141.详细信息如下:
所有者拥有读写执行权限
用户组拥有读写执行权限
其他人拥有读写执行权限
文件是一个普通文件
文件设置了SUID权限
文件设置了GUID权限
UID=0
GID=0
占用block=8
block大小=4096
最后访问时间=1397539372
最后状态更新时间=1397539373
最后修改时间=1397539372
===================================================
==================扫描文件夹============================
.bashrc:644
.bash_logout:644
.mozilla:755
extensions:755
plugins:755
.nautilus:755
metafiles:700
目录创建成功
文件创建成功
==================扫描文件夹==========================
myfile:766
文件删除成功
目录删除成功
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。