Linux的文件操作有两种方式:
①Linux系统调用方式,这种方式依赖于Linux系统
②C语言的文件操作,采用C语言的库函数实现。
以下是Linux系统调用方式:
1. 创建文件
int creat(const char *filename, mode_t mode)
filename:要创建的文件名,包含路径,缺省时为当前路径;
mode:创建模式
常见创建模式:
S_IRUSR 可读 4(直接用数字来表示文件的访问权限)
S_IWUSR 可写 2
S_IXUSR 可执行 1
S_IRWXU 可读、写、执行 7
实例如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void create_file(char *filename){
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);
}
注意:代码中的系统头文件都在/usr/include目录下,这个目录是gcc定义的系统目录
访问权限
每一个文件或是目录的访问权限都有三组,每组用三位表示,分别为文件所有者的读、写和执行权限;与所有者同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l 命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。
例如:$ ls –l sobcrc.tgz
-rw-r--r-- 1 root root 483997 Jul 15 17:31 sobcrc.tgz
注意这里共有10个位置。第一个字符指定了文件类型,如果第一个字符是横线,表示是一个非目录的普通文件,如果是d,表示是一个目录。r代表只读,w代表写,x代表可执行,横线代表无该项权限。
2. 打开文件和关闭文件 文件描述 在Linux系统中,所有打开的文件都对应一个文件描述符。文件描述符的本质是一个非负整数。当打开一个文件时,该整数由系统来分配。文件描述符的范围是0~OPEN_MAX。 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标志时,才使用int open(const char*pathname, int flags, mode_t mode) 这时,mode指定创建文件的权限。 int close(int fd) 用于关闭打开的文件,其中fd是已经打开的文件描述符。 例子如下: #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 read(int fd, const void *buf, size_t length) 功能:从文件描述符fd所指定的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际所读取的字节数。 int write(int fd, const void *buf, size_t length) 功能:把length个字节从buf指向的缓冲区写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。 int lseek(int fd, offset_t offset, int whence) 功能:将文件读写的指针相对于whence移动offset个字节(可为负值,表示向前移动)。操作成功后,返回文件指针相对于头文件的位置。 Whence可使用下述值: SEEK_SET:相对文件开头 SEEK_CUR:相对文件读写指针的当前位置 SEEK_END:相对文件末尾 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环境下文件操作的方法,包括创建、打开、关闭文件及文件拷贝等核心系统调用。通过实例演示如何使用这些系统调用来实现具体的文件管理任务。
1660

被折叠的 条评论
为什么被折叠?



