文件操作——利用Linux系统调用

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

1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8  void create_file(char *filename){
9
10 /*创建的文件的属性0755表示:
11 文件所有者可读可写可执行;
12 文件所有者所在组用户可读可执行;
13 其他用户可读可执行*/
14 if(creat(filename,0755)<0){
15 printf("create file %s failure!\n",filename);
16 exit(EXIT_FAILURE);
17 }else{
18 printf("create file %s success!\n",filename);
19 }
20 }
21
22 int main(int argc,char *argv[]){
23 int i;
24 if(argc<2){
25 perror("you haven't input the filename,please try again!\n");
26 exit(EXIT_FAILURE);
27 }
28
29 for(i=1;i<argc;i++){
30 create_file(argv[i]);
31 }
32
33 exit(EXIT_SUCCESS);
34 }
35
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来表示文件的访问权限。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 int main(int argc ,char *argv[]){
9 int fd;
10 if(argc<2){
11 puts("please input the open file pathname!\n");
12 exit(1);
13 }
14
15 //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755
16 //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错.
17 //所以fd=open(argv[1],O_RDWR),仅仅只是打开指定文件
18 if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){
19 perror("open file failure!\n");
20 exit(1);
21 }else{
22 printf("open file %d success!\n",fd);
23
24 }
25 close(fd);
26 exit(0);
27
28 }
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。
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <fcntl.h>
4 #include <stdio.h>
5 #include <errno.h>
6
7 #define BUFFER_SIZE 1024
8
9 int main(int argc,char **argv)
10 {
11 int from_fd,to_fd;
12 int bytes_read,bytes_write;
13 char buffer[BUFFER_SIZE];
14 char *ptr;
15
16 if(argc!=3)
17 {
18 fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);
19 exit(1);
20 }
21
22 /* 打开源文件 */
23 if((from_fd=open(argv[1],O_RDONLY))==-1)
24 {
25 fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
26 exit(1);
27 }
28
29 /* 创建目的文件 */
30 if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
31 {
32 fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));
33 exit(1);
34 }
35
36 /* 以下代码是一个经典的拷贝文件的代码 */
37 while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
38 {
39 /* 一个致命的错误发生了 */
40 if((bytes_read==-1)&&(errno!=EINTR)) break;
41 else if(bytes_read>0)
42 {
43 ptr=buffer;
44 while(bytes_write=write(to_fd,ptr,bytes_read))
45 {
46 /* 一个致命错误发生了 */
47 if((bytes_write==-1)&&(errno!=EINTR))break;
48 /* 写完了所有读的字节 */
49 else if(bytes_write==bytes_read) break;
50 /* 只写了一部分,继续写 */
51 else if(bytes_write>0)
52 {
53 ptr+=bytes_write;
54 bytes_read-=bytes_write;
55 }
56 }
57 /* 写的时候发生的致命错误 */
58 if(bytes_write==-1)break;
59 }
60 }
61 close(from_fd);
62 close(to_fd);
63 exit(0);
64 }
65

 

posted @ 2010-07-15 13:28  MikeLin  阅读(1191)  评论(0编辑  收藏  举报