说明:
linux下文件编程可使用两种方法:
****linux系统调用
****C语言库函数
前者依赖于linux系统,后者与操作系统是独立的。
在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。
这里首先记录下Linux下系统调用操作文件编程的学习过程。
函数原型:
1、系统调用--创建:
int create(const char *filename, mode_t mode);
filename为要创建的文件名(包含路径,缺省为当前路径);
mode为创建模式。
模式可用数字来表示:
可执行为1;
可写为2;
可读为4;
上述和,如可写可读为6,对应文件权限。
文件描述符:在linux系统中,所有打开的文件都对应一个文件描述符。
2、系统调用--打开:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname为要打开的文件名(包含路径,缺省为当前路径)
flags为打开标志,常见的打开标志:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_APPEND 追加方式
O_CREAT 创建一个文件
O_NOBLOCK 非阻塞方式
如果使用了O_CREAT标志,则使用带mode的open函数,这时要指定文件权限。
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);
功能:把length个字节从buf指向的缓冲区中写到fd所指向的文件中,
返回实际写入的字节数。
6、系统调用--定位
int lseek(int fd, offset_t offset, int whence);
功能:将文件读写指针相对whence移动offset个字节。
操作成功,返回文件指针相对于文件头的位置。
whence可用下数值:
SEEK_SET 相对文件开头
SEEK_CUR 相对文件读写指针的当前位置
SEEK_END 相对文件末尾
offset可取负值,表示向前移动。
计算文件长度时,可用 lseek(fd, 0, SEEK_END);
7、系统调用--访问判断
int access(const char *pathname, int mode);
功能:判断文件是否可以进行某种操作。
mode可取R_OK可读、W_OK可写、X_OK可执行、F_OK文件存在。
返回值:测试成功时,返回0,否则返回-1。
代码实例如下:
1 **************************************** 2 功能:实现文件的复制工作; 3 练习文件操作的系统调用函数的使用 4 如:open、close、read、write、lseek 5 编译:gcc linux_file_cp.c 6 执行:./a.out src_file dst_file 7 说明:src_file为保存有原来内容的文件 8 dst_file为要创建的文件。 9 日期:2015.9.22 10 *****************************************/ 11 12 #include <stdio.h> 13 #include <stdlib.h> 14 #include <unistd.h> 15 #include <sys/types.h> 16 #include <sys/stat.h> 17 #include <fcntl.h> 18 19 #define BUFFER_SIZE 1024 20 21 int main(int argc,char **argv) 22 { 23 int from_fd; 24 int to_fd; 25 long file_len=0; 26 char buffer[BUFFER_SIZE]; 27 char *ptr; 28 29 /*判断入参*/ 30 if(argc!=3) 31 { 32 printf("Usage:%s fromfile tofile\n",argv[0]); 33 exit(1); 34 } 35 36 /* 打开源文件 */ 37 if((from_fd=open(argv[1], O_RDONLY)) == -1) 38 { 39 printf("Open %s Error\n",argv[1]); 40 exit(1); 41 } 42 43 /* 创建目的文件 */ 44 /*如果目的文件不存在,则创建*/ 45 if((to_fd=open(argv[2], O_RDWR | O_CREAT, 0666)) == -1) 46 { 47 printf("Open %s Error\n",argv[2]); 48 exit(1); 49 } 50 51 /*测得文件大小*/ 52 file_len = lseek(from_fd, 0L, SEEK_END); 53 lseek(from_fd, 0L, SEEK_SET); 54 printf("from file size is= %d\n",file_len); 55 56 /*进行文件拷贝*/ 57 while((read(from_fd, buffer, BUFFER_SIZE)) != 0) 58 { 59 write(to_fd, buffer, file_len); 60 } 61 close(from_fd); 62 close(to_fd); 63 exit(0); 64 }