linux c++ 拷贝文件问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux c++ 拷贝文件问题相关的知识,希望对你有一定的参考价值。
自动包括子目录;
通过命令行参数完成<[源路径]源文件><目的路径>
要求源文件名支持通配符‘*’,例如:*.zip或*.rar,支持上述两种格式即可;
#include <string.h>
#include <io.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
/*********************************************************************
功能:复制文件
参数:pSrc,原文件名
pDes,目标文件名
返回:<0,失败
>0,成功
作者:
*********************************************************************/
#define BUF_SIZE 256
int copyFile(const char * pSrc,const char *pDes)
FILE *in_file, *out_file;
char data[BUF_SIZE];
size_t bytes_in, bytes_out;
long len = 0;
if ( (in_file = fopen(pSrc, "rb")) == NULL )
perror(pSrc);
return -2;
if ( (out_file = fopen(pDes, "wb")) == NULL )
perror(pDes);
return -3;
while ( (bytes_in = fread(data, 1, BUF_SIZE, in_file)) > 0 )
bytes_out = fwrite(data, 1, bytes_in, out_file);
if ( bytes_in != bytes_out )
perror("Fatal write error.\n");
return -4;
len += bytes_out;
printf("copying file .... %d bytes copy\n", len);
fclose(in_file);
fclose(out_file);
return 1;
/*********************************************************************
功能:复制(非空)目录
参数:pSrc,原目录名
pDes,目标目录名
返回:<0,失败
>0,成功
作者:
*********************************************************************/
int copyDir(const char * pSrc,const char *pDes)
if (NULL == pSrc || NULL == pDes) return -1;
mkdir(pDes);
char dir[MAX_PATH] = 0;
char srcFileName[MAX_PATH] = 0;
char desFileName[MAX_PATH] = 0;
char *str = "\\*.*";
strcpy(dir,pSrc);
strcat(dir,str);
//首先查找dir中符合要求的文件
long hFile;
_finddata_t fileinfo;
if ((hFile = _findfirst(dir,&fileinfo)) != -1)
do
strcpy(srcFileName,pSrc);
strcat(srcFileName,"\\");
strcat(srcFileName,fileinfo.name);
strcpy(desFileName,pDes);
strcat(desFileName,"\\");
strcat(desFileName,fileinfo.name);
//检查是不是目录
//如果不是目录,则进行处理文件夹下面的文件
if (!(fileinfo.attrib & _A_SUBDIR))
copyFile(srcFileName,desFileName);
else//处理目录,递归调用
if ( strcmp(fileinfo.name, "." ) != 0 && strcmp(fileinfo.name, ".." ) != 0 )
copyDir(srcFileName,desFileName);
while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
return 1;
return -3;
参考技术A Linux下C语言实现文件拷贝
/*
Function:copy file from file1 to file2
How to execute: ./copyfile file1 file2 (under Linux)
Data:2007-05-09
*/
#include <stdio.h> /*fprintf(),stderr,BUFSIZ*/
#include <stdlib.h> /**/
#include <string.h> /*stderror()*/
#include <fcntl.h> /*open(),flag*/
#include <errno.h> /*errno*/
#include <unistd.h> /*ssize_t*/
#include <sys/types.h>
#include <sys/stat.h> /*mode_t*/
#define BUFFER_SIZE 3
int main(int argc,char **argv)
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!=3)
fprintf(stderr,"Usage:%s fromfile tofile\n\a",argv[0]);
exit(1);
/* 打开源文件 */
if((from_fd=open(argv[1],O_RDONLY))==-1) /*open file readonly,返回-1表示出错,否则返回文件描述符*/
fprintf(stderr,"Open %s Error:%s\n",argv[1],strerror(errno));
exit(1);
/* 创建目的文件 */
/* 使用了O_CREAT选项-创建文件,open()函数需要第3个参数,
mode=S_IRUSR|S_IWUSR表示S_IRUSR 用户可以读 S_IWUSR 用户可以写*/
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));
exit(1);
/* 以下代码是一个经典的拷贝文件的代码 */
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
/* 一个致命的错误发生了 */
if((bytes_read==-1)&&(errno!=EINTR))
break;
else if(bytes_read>0)
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
/* 一个致命错误发生了 */
if((bytes_write==-1)&&(errno!=EINTR))
break;
/* 写完了所有读的字节 */
else if(bytes_write==bytes_read)
break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
ptr+=bytes_write;
bytes_read-=bytes_write;
/* 写的时候发生的致命错误 */
if(bytes_write==-1)
break;
close(from_fd);
close(to_fd);
return;
参考技术B 你想问什么问题,请描述清楚些,方便回答
C++浅拷贝深拷贝
1. C++ 浅拷贝
什么是浅拷贝?
一般比较形象的理解,浅拷贝可以理解"值"层面的拷贝,深拷贝可以理解成"内存"上的拷贝,特别是类里面含有指针类型的。
// .h文件
class HasPtrMem
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();
void print();
int *p;
;
// .cpp 文件
HasPtrMem::HasPtrMem() : p(new int(0))
cout << "HasPtrMem()" << endl;
void HasPtrMem::print()
cout << *p << endl;
HasPtrMem::HasPtrMem(const HasPtrMem& h)
*p = *h.p;
HasPtrMem::~HasPtrMem()
delete p;
// main.cpp
HasPtrMem a;
HasPtrMem b(a)
a.print(); // 输出0
b.print(); // 输出0
上面这段代码的执行
HasPtrMem a; // 调用HasPtrMem::HasPtrMem() : p(new int(0))
HasPtrMem b(a) // 实际上是HasPtrMem b = a,调用HasPtrMem::HasPtrMem(const HasPtrMem& h)
此时main函数执行结束后都会调用析构函数对p的内存进行释放,但是,对象b实际上是指向对象b的内存(相当于直接赋值)
如果此时析构函数先对a对象进行析构,此时释放a对象里面指针p的内存,接着再对b对象析构,释放b对象的指针内存,程序crash(由于P的内存实际上在a对象已经被嘎掉了)
所以,类对象里面包含指针数据的,一定要实现深拷贝
2. C++ 深拷贝
深拷贝就是对实际内存进行分配,在对内存的值进行赋值填充(表达不好,有哪个意思懂就可以哈)
深拷贝代码
// .h文件
class HasPtrMem
public:
HasPtrMem();
HasPtrMem(const HasPtrMem& h);
~HasPtrMem();
void print();
int *p;
;
// .cpp文件
HasPtrMem::HasPtrMem() : p(new int(0))
cout << "HasPtrMem()" << endl;
void HasPtrMem::print()
cout << *p << endl;
HasPtrMem::HasPtrMem(const HasPtrMem& h)
p = new int(*h.p);
HasPtrMem::~HasPtrMem()
delete p;
这就是深拷贝浅拷贝,不注意就会带来坑爹的代码,造成程序嘎嘎crash!!!!!
以上是关于linux c++ 拷贝文件问题的主要内容,如果未能解决你的问题,请参考以下文章