2010-03-29 28 views
7

Estoy tratando de escribir un programa que toma un archivo grande (de cualquier tipo) y lo divide en muchos "trozos" más pequeños. Creo que tengo la idea básica baja, pero por alguna razón no puedo crear un tamaño de fragmento de más de 12 kb. Sé que hay algunas soluciones en google, etc. pero estoy más interesado en saber cuál es el origen de esta limitación y, en realidad, utilizar el programa para dividir archivos.Dividir un archivo grande en C++

//This file splits are larger into smaller files of a user inputted size. 
#include<iostream> 
#include<fstream> 
#include<string> 
#include<sstream> 
#include <direct.h> 
#include <stdlib.h> 
using namespace std; 

void GetCurrentPath(char* buffer) 
{ 
_getcwd(buffer, _MAX_PATH); 
} 


int main() 
{ 
// use the function to get the path 
char CurrentPath[_MAX_PATH]; 
GetCurrentPath(CurrentPath);//Get the current directory (used for displaying output) 

fstream bigFile; 
string filename; 
int partsize; 
cout << "Enter a file name: "; 
cin >> filename; //Recieve target file 
cout << "Enter the number of bites in each smaller file: "; 
cin >> partsize; //Recieve volume size 

bigFile.open(filename.c_str(),ios::in | ios::binary); 
bigFile.seekg(0, ios::end); // position get-ptr 0 bytes from end 
int size = bigFile.tellg(); // get-ptr position is now same as file size 
bigFile.seekg(0, ios::beg); // position get-ptr 0 bytes from beginning 

for (int i = 0; i <= (size/partsize); i++) 
{ 
    //Build File Name 
    string partname = filename; //The original filename 
    string charnum;  //archive number 
    stringstream out; //stringstream object out, used to build the archive name 
    out << "." << i; 
    charnum = out.str(); 
    partname.append(charnum); //put the part name together 

    //Write new file part 
    fstream filePart; 
    filePart.open(partname.c_str(),ios::out | ios::binary); //Open new file with the name built above 
    //Check if near the end of file 
    if (bigFile.tellg() < (size - (size%partsize))) 
    { 
    filePart.write(reinterpret_cast<char *>(&bigFile),partsize); //Write the selected amount to the file 
    filePart.close(); //close file 
    bigFile.seekg(partsize, ios::cur); //move pointer to next position to be written 
    } 
    //Changes the size of the last volume because it is the end of the file 
    else 
    { 
    filePart.write(reinterpret_cast<char *>(&bigFile),(size%partsize)); //Write the selected amount to the file 
    filePart.close(); //close file 
    } 
    cout << "File " << CurrentPath << partname << " produced" << endl; //display the progress of the split 
} 


bigFile.close(); 
cout << "Split Complete." << endl; 
return 0; 
} 

¿Alguna idea?

Respuesta

4

Usted está escribiendo en el archivo dividido, pero no está leyendo desde el archivo grande. Lo que está escribiendo es la estructura en memoria del bigfile, no el contenido de bigfile. Necesita asignar un búfer, leer en él desde bigfile y escribirlo en el archivo de división.

+0

Este fue exactamente el problema, por lo que estos cambios funcionaron perfectamente. ¡Gracias! – wdow88

Cuestiones relacionadas