2010-03-29 14 views
7

Sto provando a scrivere un programma che prende un file di grandi dimensioni (di qualsiasi tipo) e lo suddivide in molti "blocchi" più piccoli. Penso di avere un'idea di base, ma per qualche motivo non riesco a creare una dimensione del blocco superiore a 12 kb. So che ci sono alcune soluzioni su google, ecc., Ma sono più interessato ad apprendere quale sia l'origine di questa limitazione in realtà utilizzando il programma per suddividere i file.Dividere un file di grandi dimensioni in 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; 
} 

Qualche idea?

risposta

4

Si sta scrivendo nel file diviso, ma non si legge dal bigfile. Quello che stai scrivendo è la struttura in-memory del bigfile, non il contenuto di bigfile. È necessario allocare un buffer, leggerlo dal bigfile e scriverlo negli splitfile.

+0

Questo era esattamente il problema, rendendo queste modifiche funzionate perfettamente. Grazie! – wdow88

Problemi correlati