文件操作——利用Linux系统调用
2010-07-15 13:28
375 查看
1.创建文件
int creat(const char *filename, mode_t mode)
filename:要创建的文件名(包含路径,缺省为当前路径)
mode:创建的文件的模式/访问权限
常见模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IRWXU 可读、可写、可执行
还可以直接使用数字来表示文件的访问权限:
可执行 1
可写 2
可读 4
上述三个值的和,如可读可写可执行 7(1+2+4)
无任何权限 0
2.打开文件
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mode_t mode)
常见打开标志(flags):
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR 读写方式打开
O_APPEND 追加方式打开
O_CREATE 创建一个文件
O_NOBLOCK 非阻塞方式打开
如果使用了O_CREATE标志,则必须指定mode来表示文件的访问权限。
3.关闭文件
int close(int fd)
fd:文件描述符(一个非负整数)
4.读文件
int read(int fd, const void *buf, size_t length)
从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回实际读取的字节数。
5.写文件
int write(int fd, const void *buf, size_t length)
把buf所指向的缓冲区中的length个字节写到文件描述符fd所指向的文件中,返回实际写入的字节数。
6.定位文件(移动文件指针)
int lseek(int fd, offset_t offset, int whence)
将文件读写指针相对whence移动offset个字节。操作成功,则返回文件指针相对于文件头的位置。
whence可以取下述值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
offset可取负值,表示向前移动。
7.访问权限判断
int access(const char *pathname, int mode)
pathname:文件名称
mode:要判断的访问权限,可以取下面的值或者它们的组合。R_OK:文件可读,W_OK:文件可写,X_OK:文件可执行,F_OK:文件存在。
返回值:当我们测试成功时,函数返回0,否则如果有一个条件不符合,返回-1。
int creat(const char *filename, mode_t mode)
filename:要创建的文件名(包含路径,缺省为当前路径)
mode:创建的文件的模式/访问权限
常见模式:
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IRWXU 可读、可写、可执行
还可以直接使用数字来表示文件的访问权限:
可执行 1
可写 2
可读 4
上述三个值的和,如可读可写可执行 7(1+2+4)
无任何权限 0
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void create_file(char *filename){ /*创建的文件的属性0755表示: 文件所有者可读可写可执行; 文件所有者所在组用户可读可执行; 其他用户可读可执行*/ if(creat(filename,0755)<0){ printf("create file %s failure!\n",filename); exit(EXIT_FAILURE); }else{ printf("create file %s success!\n",filename); } } int main(int argc,char *argv[]){ int i; if(argc<2){ perror("you haven't input the filename,please try again!\n"); exit(EXIT_FAILURE); } for(i=1;i<argc;i++){ create_file(argv[i]); } exit(EXIT_SUCCESS); }
2.打开文件
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mode_t mode)
常见打开标志(flags):
O_RDONLY 只读方式打开
O_WRONLY 只写方式打开
O_RDWR 读写方式打开
O_APPEND 追加方式打开
O_CREATE 创建一个文件
O_NOBLOCK 非阻塞方式打开
如果使用了O_CREATE标志,则必须指定mode来表示文件的访问权限。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc ,char *argv[]){ int fd; if(argc<2){ puts("please input the open file pathname!\n"); exit(1); } //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755 //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错. //所以fd=open(argv[1],O_RDWR),仅仅只是打开指定文件 if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){ perror("open file failure!\n"); exit(1); }else{ printf("open file %d success!\n",fd); } close(fd); exit(0); }
3.关闭文件
int close(int fd)
fd:文件描述符(一个非负整数)
4.读文件
int read(int fd, const void *buf, size_t length)
从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回实际读取的字节数。
5.写文件
int write(int fd, const void *buf, size_t length)
把buf所指向的缓冲区中的length个字节写到文件描述符fd所指向的文件中,返回实际写入的字节数。
6.定位文件(移动文件指针)
int lseek(int fd, offset_t offset, int whence)
将文件读写指针相对whence移动offset个字节。操作成功,则返回文件指针相对于文件头的位置。
whence可以取下述值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
offset可取负值,表示向前移动。
7.访问权限判断
int access(const char *pathname, int mode)
pathname:文件名称
mode:要判断的访问权限,可以取下面的值或者它们的组合。R_OK:文件可读,W_OK:文件可写,X_OK:文件可执行,F_OK:文件存在。
返回值:当我们测试成功时,函数返回0,否则如果有一个条件不符合,返回-1。
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #define BUFFER_SIZE 1024 int main(int argc,char **argv) { int from_fd,to_fd; int bytes_read,bytes_write; char buffer[BUFFER_SIZE]; char *ptr; if(argc!=3) { fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]); exit(1); } /* 打开源文件 */ if((from_fd=open(argv[1],O_RDONLY))==-1) { fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno)); exit(1); } /* 创建目的文件 */ if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) { fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno)); exit(1); } /* 以下代码是一个经典的拷贝文件的代码 */ while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) { /* 一个致命的错误发生了 */ if((bytes_read==-1)&&(errno!=EINTR)) break; else if(bytes_read>0) { ptr=buffer; while(bytes_write=write(to_fd,ptr,bytes_read)) { /* 一个致命错误发生了 */ if((bytes_write==-1)&&(errno!=EINTR))break; /* 写完了所有读的字节 */ else if(bytes_write==bytes_read) break; /* 只写了一部分,继续写 */ else if(bytes_write>0) { ptr+=bytes_write; bytes_read-=bytes_write; } } /* 写的时候发生的致命错误 */ if(bytes_write==-1)break; } } close(from_fd); close(to_fd); exit(0); }
相关文章推荐
- 利用文件操作的系统调用 实现 Linux 中的cp 功能
- LINUX下通过系统调用的文件操作
- 【Linux环境编程入门】四、文件操作的系统调用
- Linux 文件操作——系统调用和标准I/O库
- linux系统下库函数和系统调用都对文件的基本操作
- [GNU/Linux] Linux系统调用-文件操作(二)
- Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()
- Linux系统调用 - 文件操作
- linux文件操作笔记(1)——系统调用、库函数
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- LInux文件基础知识和文件目录操作(系统调用函数方式)
- Linux 文件操作——系统调用和标准I/O库
- linux系统调用文件操作
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- [GNU/Linux] Linux系统调用-文件操作(一)
- Linux 系统调用文件编程(文件操作)
- Linux文件操作总结(系统调用和标准IO库函数)
- 文件操作——C库调用与Linux系统调用区别
- Linux 文件操作——系统调用和标准I/O库
- Linux 文件操作的系统调用接口