系統調用方式訪問文件
linux文件編程可以使用兩種方法:
1、linux系統調用
2、c語言庫函數
前者依賴於linux系統,後者與操作系統是獨立的,在任何操作系統下,使用c語言庫函數操作文件的方法都是相同的。
系統調用——創建
int creat(const char *fileanme , mode_t mode)filename:要創建的文件名(包含路徑,缺省爲當前路徑)
mode:創建模式(rwx)
常見創建模式:
S_IRUSER 可讀(4)
S_IWUSER 可寫(2)
S_IXUSER 可執行(1)
S_IRWXU 可讀、寫、執行
無任何權限爲0
argc:參數的個數
argv:參數的值保存在argv這個字符串數組裏
文件描述
在linux系統中,所有打開的文件都對應一個文件描述符。文件描述符的本質是一個非負整數,當打開一個文件時,該整數由系統來分配。文件描述符的範圍是0-OPEN_MAX。早期的UNIX版本的OPEN_MAX=19,即每個線程最多同時打開20個文件,現在很多系增加至1024.系統調用-打開(兩種模式)
int open(const char *pathname,int flags)int open(const char *pathname,int flags,mode_t mode)
pathname:要打開文件名(包含路徑,缺省爲當前路徑)
flag:打開標誌
常見打開標誌:
O_RDONLY:只讀方式打開
O_WRONLY只寫方式打開
O_RDWR讀寫方式打開
O_APPEND追加方式打開
O_CREATE創建一個文件
O_NOBLOCK非阻塞方式打開
如果使用了O_CREATE 標誌,則使用函數是;
int open(const char *pathname,int flags,mode_t mode)
這時需要指定mode來表示文件的訪問權限。(創建的時候需要指定文件的屬性)
系統調用-關閉
當我們操作完文件以後,需要關閉文件:int close(int fd)
fd:文件描述符,(系統分佈從open系統調用獲取
系統調用-讀
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:相對文件末尾
offset可取負值,表示向前移動。
例如:lseek(fd,-5,SEEK_CUR)表示可將文件指針相對當前位置向前移動5個字節。
系統調用-訪問判斷
有時候我們需要判斷文件是否可以進行哪種操作(rwx)這時候我們可以使用access函數:iint access(const shar*pathname,int mode)
pathname:文件名
mode:要判斷訪問權限。可以取一下值或者是他們的組合。R_OK:文件可讀,W_OK:文件可寫,X_OK:文件可執行,F_OK文件存在。
返回值:當測試成功時返回0,否則一個條件不符時,返回-1.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#define BUFFER_SIZE 1024
/*
* 程序入口
* */
int main(int argc,char **argv)
{
int from_fd, to_fd;
long file_len=0;
int ret=1;
char buffer[BUFFER_SIZE];
char *ptr;
/*判斷入參*/
if(argc!=3)
{
printf("Usage:%s fromfile tofile\n",argv[0]);
exit(1);
}
/*打開原文件*/
if((from_fd=open(argv[1], O_RDONLY|O_CREAT))==-1)
{
printf("Open %s Error\n",argv[1]);
exit(1);
}
/*創建目標文件*/
if((to_fd=open(argv[2], O_WRONLY|O_CREAT))==-1)
{
printf("Open %s Error\n",argv[2]);
exit(1);
}
/*測的文件大小*/
file_len= lseek(from_fd,0L,SEEK_END);
lseek(from_fd,0L,SEEK_SET);
printf("form file size is %d\n",file_len);
/*進行文件拷貝*/
while(ret)
{
ret= read(from_fd, buffer, BUFFER_SIZE);
if(ret==-1)
{
printf("read Error\n");
exit(1);
}
write(to_fd, buffer, ret);
file_len-=ret;
bzero(buffer,BUFFER_SIZE);
}
printf("there are %d byte(s) data left without copy\n", file_len);
close(from_fd);
close(to_fd);
exit(0);
}