文件操作——利用Linux系統調用(2)
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
2 #include
3 #include
4 #include
5 #include
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 }