5

I'm trying to move files on linux by using C++. The Problem is, that the source file and the destination folder can be in different partitions. So I can't simply move the files. Ok. I decided to copy the file and delete the old one.

//-----
bool copyFile(string source, string destination)
{
    bool retval = false;
    ifstream srcF (source.c_str(), fstream::binary);
    ofstream destF (destination.c_str(), fstream::trunc|fstream::binary);
    if(srcF.is_open() && destF.is_open()){
        destF << srcF.rdbuf(); //copy files binary stream
        retval = true;
    }
    srcF.close();
    destF.close();
    return retval;
}
//-----

Now my problem. I realized, this method is very slow. It takes 47 seconds for 100MB. Simply copy a file with the console command takes 2-3 seconds.

Does anybody have an idea?

tshepang
  • 12,111
  • 21
  • 91
  • 136
Korbi
  • 714
  • 1
  • 9
  • 18
  • 2
    The following answer is your best bet: http://stackoverflow.com/questions/10195343/copy-a-file-in-an-sane-safe-and-efficient-way – Diego Giagio Oct 24 '13 at 11:57

2 Answers2

3

Streams are known to be pretty slow. You can either use tools provided by operating system or you can use some portable wrapper.

I would recommend boost::filesystem, because it is planned to be added to STL (C++14 ?).

Documentation here: boost::filesystem::copy_file().

Johny
  • 1,947
  • 13
  • 23
-1

Using Linux - rename(old name, new name);

HandyManDan
  • 148
  • 1
  • 6
  • This will not work. You will get an error (Invalid cross-device link), if source and destination are on different partitions. – Korbi Jan 29 '15 at 07:52