现在的位置: 首页 > 综合 > 正文

部分GNU代码片 11、合并文件

2013年12月09日 ⁄ 综合 ⁄ 共 1937字 ⁄ 字号 评论关闭

//合并文件
static inline int Merge(const char* src_filename, const char* dst_filename)
{
    int dst_fd = 0, src_fd = 0;
    unsigned long long dst_size = 0, src_size = 0;
    unsigned dst_count = 0, src_count = 0;
    char* buffer = NULL;
    const int buff_len = 1024 * 1024 * 4;
    unsigned long long offset = sizeof(int);
    long long read_len = 0, read_left_len = 0;
    long long write_len = 0, write_left_len = 0;
    int ret = 0;
   
//    dst_fd = open(dst_filename, O_CREAT | O_RDWR | O_LARGEFILE, 0666);
//    src_fd = open(src_filename, O_RDONLY | O_LARGEFILE, 0666);
   
    dst_fd = open(dst_filename, O_CREAT | O_RDWR , 0666);
    src_fd = open(src_filename, O_RDONLY , 0666);
    if(dst_fd < 0 || src_fd < 0)
    {
        ret = -1;
        goto __end;
    }

//    src_size = (unsigned long long)lseek64(src_fd, 0, SEEK_END);
//    dst_size = (unsigned long long)lseek64(dst_fd, 0, SEEK_END);

    src_size = (unsigned long long)lseek(src_fd, 0, SEEK_END);
    dst_size = (unsigned long long)lseek(dst_fd, 0, SEEK_END);
   
//    lseek64(src_fd, 0, SEEK_SET);
//    lseek64(dst_fd, 0, SEEK_SET);
   
    lseek(src_fd, 0, SEEK_SET);
    lseek(dst_fd, 0, SEEK_END);
   
    read_left_len = src_size;
   
    buffer = new char[buff_len];
    while(read_left_len)
    {
        read_len = read(src_fd, buffer, buff_len); 
        if(read_len == -1)
        {  
            if(errno != EINTR)
                goto __end;
            else
                continue;
        }
        read_left_len -= read_len;
        write_left_len = read_len;
        offset = 0;
        while(write_left_len)
        {  
            write_len = write(dst_fd, buffer + offset, write_left_len);
            if(write_len == -1)
            {  
                if(errno != EINTR)
                    goto __end;
                else
                    continue;
            }
            write_left_len -= write_len;
            offset += write_len;
        }
    }
    dst_count += src_count;
//    lseek64(dst_fd, 0, SEEK_SET);
    lseek(dst_fd, 0, SEEK_SET);
    write(dst_fd, (void*)&dst_count, sizeof(int)); 

__end: 
    if(src_fd > 0)
        close(src_fd);
    if(dst_fd > 0)
        close(dst_fd);
    if(buffer)
        delete [] buffer;  
    return ret;

抱歉!评论已关闭.