#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
//#include <sys/types.h>
//#include <sys/stat.h>
#include <fcntl.h>
void main(int argc,char* argv[])
{
struct stat buf;
int fd1,fd2,fd3,ret,len,length;
char cbuf[100];
len=atoi(argv[2]);
printf("\nfilename:%s bytes:%d",argv[1],len);
fd1=creat(argv[1],0777);
printf("\ncreate %s, fd1=%d",argv[1],fd1);
fd2=open(argv[1],O_CREAT|O_RDWR,0777);
printf("\nopen %s, fd2=%d",argv[1],fd2);
ret = write(fd2,"I am hanyang!!!",strlen("I am hanyang!!!"));
printf("\nwrite %d bytes",ret);
close(fd2);
fd3=open(argv[1],O_CREAT|O_RDWR,0777);
printf("\nopen %s, fd3=%d",argv[1],fd3);
ret = read(fd3,cbuf,len);
printf("\nread %d(%d) bytes:%s",len,ret,cbuf);
close(fd3);
stat(argv[1], &buf);
printf("\n%s file size = %d ",argv[1],buf.st_size);
fd3=open(argv[1],O_CREAT|O_RDWR,0777);
length = lseek(fd3,0,SEEK_END);
close(fd3);
printf("\nlseek length:%d bytes",length);
printf("\nremove %s\n",argv[1]);
// remove(argv[1]);
}
*************************************************************************************************************************************************
creat
头文件:
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
#include <fcntl.h> // 提供open()函数
#include <sys/types.h> // 提供mode_t类型
#include <sys/stat.h> // 提供open()函数的符号
#include <unistd.h> // 提供close()函数
函数定义:int creat(const char * pathname, mode_tmode)
函数说明:
1、参数 pathname 指向欲建立的文件路径字符串。
2、Creat()相当于使用下列的调用方式调用open()
open(const char * pathname, (O_CREAT|O_WRONLY|O_TRUNC));
filename:要创建的文件名(包括路径,默认当前路径)
mode:创建模式,指定用户操作权限(针对三种用户设置:所处用户,所处用户组,其他用户
权限:读,写,执行)
(0表示没有任何权限
S_IRUSR可读,1
S_IWUSR可写,2
S_IXUSR可执行,4
S_IRWXR可读、写、执行)7(也可以用数字代替,如0777)
返回值:
文件描述符,值为一个整数,发生错误时返回-1,并把错误代码设给errno
*************************************************************************************************************************************************
remove
头文件:
#include <stdio.h>
函数定义:
int remove(const char *filename)
参数:
- filename -- 这是 C 字符串,包含了要被删除的文件名称。
返回值:
-
如果成功,则返回零。如果错误,则返回 -1,并设置 errno。
*************************************************************************************************************************************************
open
头文件:
#include<fcntl.h>//在centos6.0中只要此头文件就可以
#include<sys/types.h>
#incldue<sys/stat.h>
功能:打开和创建文件(建立一个文件描述符,其他的函数可以通过文 件描述符对指定文件进行读取与写入的操作。)
nt open(const char*pathname,int flags);
int open(const char*pathname,int flags,mode_t mode);
参数说明:
1.pathname
要打开或创建的目标文件
2.flags
打开文件时,可以传入多个参数选项,用下面的
一个或者多个常量进行“或”运算,构成falgs
参数:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR: 读,写打开
这三个常量,必须制定一个且只能指定一个
O_CREAT: 若文件不存在,则创建它,需要使用mode选项。来指明新文件的访问权限
O_APPEND: 追加写,如果文件已经有内容,这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容
必选参数:
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_EXEC 只执行打开
O_SEARCH 只搜索打开(应用于目录)----不知道什么系统支持,也不理解这是个什么鬼难过.
可选参数(使用"|"追加)
O_APPEND 每次写都追加到文件结尾.
O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志----目前不理解什么意思.
O_CREAT 此文件不存在则创建,同时可以使用可变参数设置新文件的访问权限(让我们想起umask大笑).
O_DIRECTORY 如果path引用的不是路径则出错。
O_EXCL 同时制定O_CREAT,且文件存在则出错,用于测试文件是否存在.
O_NOCTTY 如果path引用的是终端设备,则不将此设备分配作为此进程的控制终端,----不理解.
O_NOFOLLOW 如果path引用的是一个符号链接则出错.
O_NONBLOCK 如果path引用的是一个FIFO,一个特殊的块文件,一个字特殊文件,则本次打开和后续操作都是非阻塞方式.
O_SYNC 使用每次write等待物理操作完成,包括由write引起的文件属性的变更(文件大小,更新时间等信息)
O_TRUNC 文件存在且只写/读写打开,文件长度为0.
O_DSYNC 每次write等待物理IO完成,如果写不影响读,则不需要等待.
O_RSYNC 使每一个使用文件描述符作为参数进行read的操作等待,直到写全部完成.
ps:open函数具体使用那个,和具体应用场景相关,如目标文件存在,使用两个参数的open,如果目标文件不存在,需要open创建,则第三个参数表示创建文件的默认权限。
返回值
成功:新打开的文件描述符
失败:-1
open返回的文件描述符一定是最小的而且没有被使用的。
fopen与open的区别
以可写的方式fopen一个文件时,如果文件不存在则会自动创建,而open一个文件时必须明确O_CREAT才会创建文件,否则文件不存在就出错返回
*************************************************************************************************************************************************
close
头文件:#include<unistd.h>
功能:关闭一个已经打开的文件
int close(int fd)
参数说明:
fd:需要关闭的文件描述符
返回值:
成功:返回0;
失败:返回-1,并设置errno
打开的文件描述符一定要记得关闭,否则资源会被大量的占用,导致内存不够。
*************************************************************************************************************************************************
read
#include<unistd.h>
ssize_t read(int fd, void *buf, size_t count);
函数说明
read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则
read()不会有作用并返回0。返回值为实际读取到的字节数,如果返回0,表示已到达文件尾或
是无可读取的数据,此外文件读写位置会随读取到的字节移动。
*************************************************************************************************************************************************
write
#include<unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
函数说明
write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。当然,文件读写位置
也会随之移动。
返回值
如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno
中。
*************************************************************************************************************************************************
stat
可以测文件大小
作用:获取文件信息
头文件:
include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
函数原型:int stat(const char *path, struct stat *buf)
参数:文件路径(名),struct stat 类型的结构体
返回值:成功返回0,失败返回-1;
struct stat
{
dev_t st_dev; /* ID of device containing file */文件使用的设备号
ino_t st_ino; /* inode number */ 索引节点号
mode_t st_mode; /* protection */ 文件对应的模式,文件,目录等
nlink_t st_nlink; /* number of hard links */ 文件的硬连接数
uid_t st_uid; /* user ID of owner */ 所有者用户识别号
gid_t st_gid; /* group ID of owner */ 组识别号
dev_t st_rdev; /* device ID (if special file) */ 设备文件的设备号
off_t st_size; /* total size, in bytes */ 以字节为单位的文件容量
blksize_t st_blksize; /* blocksize for file system I/O */ 包含该文件的磁盘块的大小
blkcnt_t st_blocks; /* number of 512B blocks allocated */ 该文件所占的磁盘块
time_t st_atime; /* time of last access */ 最后一次访问该文件的时间
time_t st_mtime; /* time of last modification */ /最后一次修改该文件的时间
time_t st_ctime; /* time of last status change */ 最后一次改变该文件状态的时间
};
*************************************************************************************************************************************************
lseek
头文件
#include<sys/types.h>
#include<unistd.h>
函数原型
off_t lseek(int filde,off_t offset ,int whence);
EEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
下列是较特别的使用方式:
1) 欲将读写位置移到文件开头时:
lseek(int fildes,0,SEEK_SET);
2) 欲将读写位置移到文件尾时:
lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置时:
lseek(int fildes,0,SEEK_CUR);
返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。
可能设置erron的错误代码:
EBADF: fildes不是一个打开的文件描述符。
ESPIPE:文件描述符被分配到一个管道、套接字或FIFO。
EINVAL:whence取值不当。
测文件大小:filelen= lseek(fd,0L,SEEK_END);