前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux gnu c 复制文件实例(open,close,creat,read,write)

linux gnu c 复制文件实例(open,close,creat,read,write)

作者头像
10km
发布2019-05-25 21:48:48
1.5K0
发布2019-05-25 21:48:48
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433554

linux使用open,close,creat,read,write库函数实现文件复制的实例代码如下:

代码语言:javascript
复制
#include <unistd.h>
#include<fcntl.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>

// 复制文件,成功返回0,失败返回-1
int copy_file(const char* src_path,const char* dst_path)
{
    if(src_path && dst_path){
        int in,out;
        ssize_t size;
        // TLS变量,减少堆栈占用
        static __thread char buffer[512];
        // 内置函数(nested function),用于函数返回时关闭in,out文件句柄
        int do_return(int code){
            if(-1 == code){
                perror(strerror(errno));
            }
            if(in)
                close(in);
            if(out)
                close(out);
            return code;
        }
        in=open(src_path,O_RDONLY);
        if(-1==in)
        {
            return do_return(-1);
        }
        //S_IRUSR(S_IREAD)  文件拥有者具备读权限
        //S_IWUSR(S_IWRITE) 文件拥有者具备写权限
        //S_IRGRP   用户组具备读权限
        //S_IWGRP   用户组具备写权限
        //S_IXGRP   用户组具备可执行权限
        //S_IROTH   其他用户具备读权限
        // 创建目标文件,并指定合适的权限
        const __mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH;
        out=creat(dst_path,mode);
        if(-1==out)
        {
            return do_return(-1);
        }
        while(1)
        {
            size=read(in,buffer,sizeof(buffer));
            if(size>0){
                if(-1 == write(out,buffer,size)){
                    return do_return(-1);
                }
            }else if (0 == size){
                break;
            }else if( -1 == size){
                return do_return(-1);
            }
        }
        {
            // 如果目标文件权限与所要求的权限不同则修改文件权限
            struct stat s_buf;
            stat(dst_path,&s_buf);
            if(mode != (s_buf.st_mode & mode)){
                if(-1 == chmod(dst_path,mode)){
                    return do_return(-1);
                }
            }
        }
        return do_return(0);
    }
    return -1;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档