文件系统调用示例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Co_zy/article/details/86982984

本程序可通过以下命令行方式运行
假设aaa,bbb是两个文本文件

copyfile.exe  aaa  bbb

把文件aaa内容复制到bbb,如果bbb已经存在,aaa就会覆盖它,否则,就创建它,程序调用必须提供两个参数:第一个是输入文件,第二个是输出文件.

具体代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h> //fcntl.h是unix标准中通用的头文件,其中包含的相关函数有open,fcntl,shutdown,unlink,fclose等
#include <unistd.h> //是C和C++程序设计语言中提供对POSIX操作系统API的访问功能的头文件的名称

#define BUF_SIZE 4096
#define OUTPUT_MODE 0700
int main(int argc,char *argv[])
{
    int in_fd,out_fd,rd_count,wt_count;
    char buffer[BUF_SIZE];
    if(argc!=3)
        exit(1);
    in_fd = open(argv[1],O_RDONLY);//O_RDONLY 以只读方式打开文件
    if(in_fd<0)
        exit(2);
    out_fd = creat(argv[2],OUTPUT_MODE);
    if(out_fd<0)
        exit(3);

    while(1)
    {
        rd_count = read(in_fd,buffer,BUF_SIZE);
        if(rd_count<=0)
            break;
        wt_count = write(out_fd,buffer,rd_count);
        if(wt_count <= 0)
            exit(4);
    }
    close(in_fd);
    close(out_fd);
    if(rd_count == 0)
        exit(0);
    else
        exit(5);
    return 0;
}

//D:\Ccode\OS-读写文件\bin\Debug\OS-读写文件.exe D:\aaa.txt D:\bbb.txt

int main(int argc,char *argv[])
main有两个参数,第一个表示调用该程序时命令行中包含多少个字符串,包括该程序名argv[]应该包含指向下列值的指针:

argv[0] = "copyfile.exe"
argv[1] = "aaa"
argv[2] = "bbb"

在Codeblocks中调试时我们先选择Project,然后选择Project-Set Program’s Arguments,再按照下图设置
在这里插入图片描述
在此之前我们可以现在D盘下创建aaa,bbb两个文件
aaa中输入hello,bbb文件为空,运行程序后,会发现bbb文件内容与aaa内容相同.

我们来看一下具体程序

首先声明了五个变量,(1)in_fd和out_fd用来保存文件描述符,即打开一个文件时返回的一个小整数,(2)rd_count和wt_count分别是由read和write系统调用所返回的字节数,(3)最后一个buffer是用来保存读出的数据以及提供写入数据的缓冲区.

  • 接着我们试图打开源文件并创建目标文件。如果源文件成功打开,系统会给in_fd赋予一个小的整数,用以标识源文件。后续的调用必须引用这个整数,使系统知道需要的是哪一个文件。类似地,如果目标文件也成功地创建了,out_fd会被赋予一个标识用的值。creat的第二个变量是设置保护模式。如果打开或创建文件失败,对应的文件描述符被设为-1,程序带着错误码退出。
  • 接下来是用来复制文件的循环。 一 开始试图读出4KB数据到buffer中。它通过调用库过程read来完成这项工作,该过程实际激活了read系统调用。第一个参数标识文件,第二个参数指定缓冲区,第三个参数指定读出多少字节。赋予rd_count的字节数是实际所读出的字节数。通常这个数是4096,除非剩余字节数比这个数少。当到达文件尾部时,该参数的值是0。如果rd_count是零或负数,复制工作就不能再进行下去,所以执行break语句,用以中断循环(否则就无法结束了)。
  • 调用write把缓冲区的内容输出到目标文件中去。同read类似,第一个参数标识文件,第二个参数指定缓冲区,.第三个参数指定写入多少字节。注意字节计数是实际读出的字节数,不是buf_ size。这一点是很重要的,因为最后一个缓冲区中的数据大小一般不会是4096,除非文件长度碰巧是4KB的倍数。
  • 当整个文件处理完时,超出文件尾部的首次调用会把0值返回给rd_count,这样,程序会退出循环。
  • 此时,关闭两个文件,程序退出并附有正常完成的状态码。

猜你喜欢

转载自blog.csdn.net/Co_zy/article/details/86982984