C++: copia di un file
Il programma che segue permette la copia di un file.
Da linea di comando, viene passato un file di origine, uno di destinazione ed eventualmente la dimensione del buffer di lettura/scrittura.
Ad ogni operazione di scrittura viene calcolata la percentuale di avanzamento. Al termine della copia viene stampato il tempo trascorso e la velocità di scrittura:
#include <fstream> #include <iostream> #include <sstream> #include <ctime> using namespace std; double perc(unsigned long inputLen, unsigned long writeCount) { return ( ( (double)(writeCount) )/( (double)(inputLen) ) ) * 100.0; } string percAdapter(unsigned long inputLen, unsigned long writeCount) { stringstream ss; ss << (int)(perc(inputLen, writeCount)); ss << "%"; return ss.str(); } double diffclock(clock_t start, clock_t end) { double t = end - start; return (t*1000) / CLOCKS_PER_SEC; } int main(int argc, char** argv) { unsigned int bufferSize = 8192; clock_t start; clock_t end; if(argc != 3 && argc != 4) { cerr << "Usage: copy input_file dest_file [buffer_size]" << endl; return -1; } if(argc == 4) { bufferSize = atoi(argv[3]); } ifstream input(argv[1], ios::binary); ofstream output(argv[2], ios::binary); unsigned long inputLen; unsigned long writeCount = 0; if(!input.is_open()) { cerr << "Impossibile aprire il file di input" << endl; return -2; } if(!output.is_open()) { cerr << "Impossibile aprire il file di output" << endl; return -3; } input.seekg(0, ios::end); inputLen = input.tellg(); input.seekg(0, ios::beg); cout << "Copia di " << argv[1] << " (" << inputLen << " byte) in " << argv[2] << endl; start = clock(); while(!input.eof()) { char buffer[bufferSize]; int readLen; input.read(buffer, bufferSize); readLen = input.gcount(); output.write(buffer, readLen); writeCount += readLen; cout << "[" << percAdapter(inputLen, writeCount) << "]\t"; cout << "[Scritti] " << readLen << " b | "; cout << "[Tot] " << writeCount << " b" << endl; } end = clock(); double elapsed = diffclock(start, end); // INFORMAZIONI // cout << endl; cout << "Scritti " << writeCount << " byte in " << elapsed << " ms = " << elapsed/1000.0 << " s" << endl; cout << "Velocita' media di scrittura" << endl; cout << "\t" << ( (double)(writeCount) ) / elapsed << " b/ms" << endl; //**************// input.close(); output.close(); }
Il programma apre sia il file di input che quello di output come file binari, quindi è possibile effettuare la copia di qualsiasi file.
Il programma è richiamabile in maniera simile a questa:
mycopy orig.bin dest.bin [buffer_size]
E’ possibile testare la correttezza del risultato ottenuto, ad esempio, mediante il tool a linea di comando md5sum:
md5sum orig.bin dest.bin