linux系统编程之文件操作系统,Linux学习记要-文件操作系统编程

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)

删除目录或文件

删除目录:intrmdir(路径)

删除文件:intunlink(路径)

返回值-1 代表操作失败

综合例子

#include

#include

#include

#include

#include

#include

#include

#include

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

文件删除成功

目录删除成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值