c++实现文件拷贝的功能

Posted mathyk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++实现文件拷贝的功能相关的知识,希望对你有一定的参考价值。

#include<fstream.h>
#include<iostream.h>
#include<io.h>
#include<string>
#include<cstring>
#include<direct.h>
/*
* 路径转换,将单斜杠转换成双斜杠
*/
void getDouble(char * str, int len, char * temp) //

    char * start = NULL;
    char * t = NULL;
    start = str;
    t = temp;
    for(int i = 1; i <= len; i++, ++start) //循环len次,来处理‘\‘
    
        if(* start == \\) //当为‘\‘时,在后面再加入一个‘\‘
        
            * t = * start;
            ++t;
            * t = \\;
            ++t;
        else //不为‘\‘时,原样复制到新空间
            * t = * start;
            ++t;
        
    
    * t = \0;
    //cout<<temp<<endl; //输出路径


/*
* 当有通配符*时,得到父路径
*/
void getParentPath(char * str, int len, char * temp) //得到父路径

    char * start = NULL;
    char * end = NULL;
    char * t = NULL;
    start = str;
    end = str + (len - 1); //指向最后一个位置
    t = temp;
    while( * end != \\)  //将end指向‘\‘
        end = end - 1;
    
    ++end; //将指针放到‘\‘后面

    for(; start != end; start++) //将父路径写到temp中
    
        * t = * start;
        ++t;
    
    * t = \0; //加‘\0‘结束
    //cout<<"Parent Path:"<<temp<<endl;

/*
* 得到目的路径
*/
void getDesPath(char * des, char * desPath) //得到目的路径

    strcpy(desPath, (const char *)des);
    strcat(desPath, "\\\\");
    //cout<<"Des Path:"<<desPath<<endl;


void getCommend(char * p, char * src, char * des)

    strcpy(p, "xcopy ");
    strcat(p, (const char *)src);
    strcat(p, " ");
    strcat(p, (const char *)des);
    strcat(p, " /s/e");
    //cout<<"命令:"<<p<<endl;


void fileCopy(char * src, char * des)
    long lf; //定义打开文件的句柄
    _finddata_t file; //结构体,存储文件的信息
    char currentPath[100];
    char transSrcPath[100];
    char transDesPath[100];
    char desPath[100];
    unsigned char buf[100];
    
    if((lf = _findfirst((const char *)src, &file)) != -1L) //对c盘a文件夹进行复制
    
            //cout<<"文件列表:"<<endl;
            do  //如果找到下个文件名字成功的话
                
            /*
                cout<<file.name<<endl;
                if(file.attrib == _A_NORMAL)
                    cout<<"普通文件"<<endl;
                else if(file.attrib == _A_RDONLY)
                    cout<<"只读文件"<<endl;
                else if(file.attrib == _A_HIDDEN)
                    cout<<"隐藏文件"<<endl;
                else if(file.attrib == _A_SYSTEM)
                    cout<<"系统文件"<<endl;
                else if(file.attrib == _A_SUBDIR)
                    cout<<"子目录"<<endl;
                else cout<<"存档文件"<<endl;
            */    
                getDouble(src, strlen((const char *)src), transSrcPath); //将转换的源路径存入transPath
                getParentPath(transSrcPath, strlen(transSrcPath), currentPath); //得到父路径 c:\\a\\
                
                getDouble(des, strlen((const char *)des), transDesPath); //将转换的目的路径存入transDesPath
                getDesPath(transDesPath, desPath); //得到目的路径 c:\\b\\

                
                    if(file.attrib == _A_SUBDIR) //如果为子目录
                        /*
                        *    当为子目录的时候,利用系统的命令行参数
                        *    实现子目录以及子目录内文件的拷贝
                        */

                        char dirPath[100];
                        char cmd[100];
                        getParentPath(src, strlen((const char *)src), dirPath);
                        strcat(dirPath, file.name); //构建目录的源路径 
                        //cout<<"目录路径:"<<dirPath<<endl; // c:\a\bbbabc
                        getCommend(cmd, dirPath, des);
                        system((const char *)cmd); //调用系统的命令行参数实现文件夹的拷贝

                    else //如果不是目录
                        /*
                        *    当文件不是目录时,利用fstream文件输入输出流来对每个文件
                        *    进行读/写操作,从而,达到复制的效果
                        */

                        ifstream fin((const char *)strcat(currentPath, file.name), ios::nocreate|ios::binary); //创建输入文件流
                        ofstream fout((const char *)strcat(desPath, file.name), ios::binary); //创建输入流
                
                        if(!fin)
                            cout<<"源文件路径没有找到!"<<endl;
                            return;
                        
                        if(!fout)
                            cout<<"目的路径错误!"<<endl;
                            return;
                        
                        while(!fin.eof()) //实现文件的复制
                            fin.read(buf, sizeof(buf));        
                            fout.write(buf, fin.gcount());
                        
                        fin.close(); //关闭流
                        fout.close();
                    
                    
            while(_findnext(lf, &file) == 0);
            cout<<"复制已完成!"<<endl;
            _findclose(lf);
        else
            cout<<"源文件路径没有找到!"<<endl;
        


int main()

    char src[100], des[100]; 
    cout<<"请输入路径和源文件名称:"<<endl;
    cin>>src; // c:\\a\\*abc.txt
    cout<<"请输入目的路径:"<<endl;
    cin>>des;
    fileCopy(src, des); //调用文件拷贝函数

    return 0;

 

以上是关于c++实现文件拷贝的功能的主要内容,如果未能解决你的问题,请参考以下文章

Qt 实现文件夹拷贝功能

Qt 实现文件夹拷贝功能

Qt 实现文件夹拷贝功能

文件拷贝,用C语言实现命令行式的COPY功能

Java IO编程——文件拷贝

linux c++ 拷贝文件问题