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:文件属性结构体

 

说明:statlstat的区别:当文件是一个符号链接时,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

文件删除成功

目录删除成功



Linux学习记录--文件操作系统编程,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。