user2630617
user2630617

Reputation:

How can I copy and paste a file in Windows using C++?

I have googled this, but I am still confused about how to use it. I am making a file manager, and I want to be able t o copy and paste a file into a new directory. I know to copy I need to use file.copy(), but I am not sure how to implement it into my code.

I would like to do this using fstream.

Upvotes: 7

Views: 29476

Answers (7)

Mou
Mou

Reputation: 165

Using C makes C++ projects more portable. Here my sample code is a reference for you.

int file_copy(char* fn_dst, char* fn_src) {
    FILE* pf = NULL;
    char* buf = NULL;   
    int len = 0;
    
    //get length of file src
    pf = fopen(fn_src, "r");
    if (pf == NULL) {
        printf("[%s]Failed to fopen:%s\n", __func__, fn_src);
        return -1;
    }
    fseek(pf, 0, SEEK_END);
    len = ftell(pf);
    fclose(pf);
    //allocate buf
    buf = (char*)malloc(len);
    if (buf == NULL) {
        printf("[%s]Failed to malloc\n", __func__);
        return -1;
    }
    memset(buf, 0, len);
    //read from file src
    pf = fopen(fn_src, "rb");
    if (pf == NULL) {
        printf("[%s]Failed to fopen:%s\n", __func__, fn_src);
        return -1;
    }
    fread(buf, 1, len, pf);
    fclose(pf);
    //write into file dst
    pf = fopen(fn_dst, "wb+");
    if (pf == NULL) {
        printf("[%s]Failed to fopen:%s\n", __func__, fn_dst);
        return -1;
    }
    fwrite(buf, 1, len, pf);
    fclose(pf);

    if (buf)
        free(buf);
    return 0;
}

Upvotes: 0

Ali
Ali

Reputation: 15

System::IO::File::Copy("Old Path", "New Path");

Upvotes: -3

dieram3
dieram3

Reputation: 591

Here is my implementation to copy a file, you should take a look at boost filesystem since that library will be part of the standard c++ library.

#include <fstream>
#include <memory>

//C++98 implementation, this function returns true if the copy was successful, false otherwise.

bool copy_file(const char* From, const char* To, std::size_t MaxBufferSize = 1048576)
{
    std::ifstream is(From, std::ios_base::binary);
    std::ofstream os(To, std::ios_base::binary);

    std::pair<char*,std::ptrdiff_t> buffer;
    buffer = std::get_temporary_buffer<char>(MaxBufferSize);

    //Note that exception() == 0 in both file streams,
    //so you will not have a memory leak in case of fail.
    while(is.good() and os)
    {
       is.read(buffer.first, buffer.second);
       os.write(buffer.first, is.gcount());
    }

    std::return_temporary_buffer(buffer.first);

    if(os.fail()) return false;
    if(is.eof()) return true;
    return false;
}

#include <iostream>

int main()
{
   bool CopyResult = copy_file("test.in","test.out");

   std::boolalpha(std::cout);
   std::cout << "Could it copy the file? " << CopyResult << '\n';
}

The answer of Nisarg looks nice, but that solution is slow.

Upvotes: 2

Thomas Russell
Thomas Russell

Reputation: 5980

If you are using the Win32 API then consider looking into the functions CopyFile or CopyFileEx.

You can use the first in a way similar to the following:

CopyFile( szFilePath.c_str(), szCopyPath.c_str(), FALSE );

This will copy the file found at the contents of szFilePath to the contents of szCopyPath, and will return FALSE if the copy was unsuccessful. To find out more about why the function failed you can use the GetLastError() function and then look up the error codes in the Microsoft Documentation.

Upvotes: 8

R3D3vil
R3D3vil

Reputation: 681

void copyFile(const std::string &from, const std::string &to)
{
    std::ifstream is(from, ios::in | ios::binary);
    std::ofstream os(to, ios::out | ios::binary);

    std::copy(std::istream_iterator(is), std::istream_iterator(),
          std::ostream_iterator(os));
}

Upvotes: 4

UpAndAdam
UpAndAdam

Reputation: 5467

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx

I don't know what you mean by copy and paste a file; that makes no sense. You can copy a file to another location and I assume that's what you are asking about.

Upvotes: 1

elmadj
elmadj

Reputation: 47

In native C++, you can use:

Upvotes: 0

Related Questions