//合并文件
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;
}