2013-07-29 13 views
6

Ho cercato su google, ma sono ancora confuso su come usarlo. Sto facendo un file manager e voglio poter copiare e incollare un file in una nuova directory. So di copiare Ho bisogno di usare file.copy(), ma non sono sicuro di come implementarlo nel mio codice.Come posso copiare e incollare un file in Windows usando C++?

Mi piacerebbe farlo utilizzando fstream.

+0

'CopyFile' funziona, ma come posso farlo usando fstream. –

+0

Quindi dovresti cambiare il titolo della tua domanda e specificarlo nella domanda invece di chiedere di copiare incolla in windows ... – UpAndAdam

risposta

5

Se si utilizza l'API Win32 quindi prendere in considerazione esaminando le funzioni CopyFile o CopyFileEx.

È possibile utilizzare il primo in un modo simile al seguente:

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

Questo copierà il file trovato il contenuto del szFilePath ai contenuti di szCopyPath, e tornerà FALSE se la copia non è riuscita . Per ulteriori informazioni sul perché la funzione non è riuscita, è possibile utilizzare la funzione GetLastError() e quindi cercare i codici di errore nella documentazione Microsoft.

+0

Non sto usando WinAPI –

+1

No, ma hai detto che stai lavorando "in Windows", il che significa che hai accesso all'API Win32. Non esiste un wrapper C++ standard che faccia la stessa cosa 'CopyFile/Ex()'. Se si desidera una soluzione puramente C++, è necessario creare e aprire il file di destinazione e quindi eseguire manualmente il loop del file sorgente copiando i byte nel file di destinazione, come mostrato da Nisarg e dieram3. Non efficiente quanto l'utilizzo di una soluzione OS nativa. –

+0

I * consiglio vivamente * di chiamare la funzione API invece di eseguire il rollover. –

4
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)); 
} 
+0

Dovrebbe essere 'istream_iterator ', o meglio ancora 'istreambuf_iterator '. Allo stesso modo per "ostream". –

1

Ecco la mia implementazione per copiare un file, dovresti dare un'occhiata al file system boost dato che quella libreria farà parte della libreria C++ standard.

#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'; 
} 

La risposta di Nisarg sembra bello, ma questa soluzione è lento.

-3

Sistema :: IO :: File :: Copia ("Percorso vecchio", "Percorso nuovo");

+0

Ali, potresti rimuovere questa risposta? Ci sono già un paio di risposte esistenti e migliori. Se hai un critico per qualcuno di loro, guadagna abbastanza reputazione per commentare.Per lo meno, fornire alcune spiegazioni, compresa la documentazione MSDN, eccetera. È un post di bassa qualità così com'è. – lpapp

Problemi correlati