2010-03-29 6 views
7

J'essaye d'écrire un programme qui prend un fichier volumineux (de n'importe quel type) et le scinde en plusieurs petits morceaux. Je pense que j'ai l'idée de base, mais pour une raison quelconque, je ne peux pas créer une taille de bloc supérieure à 12 ko. Je sais qu'il y a quelques solutions sur google, etc. mais je suis plus intéressé à apprendre ce que l'origine de cette limitation est en fait en utilisant le programme pour diviser les fichiers.Fractionner un fichier volumineux 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; 
} 

Des idées?

Répondre

4

Vous écrivez dans le fichier fractionné, mais vous ne lisez pas dans le fichier volumineux. Qu'est-ce que vous écrivez la structure en mémoire du fichier volumineux, pas le contenu de bigfile. Vous devez allouer un tampon, le lire depuis bigfile et l'écrire dans le (s) fichier (s) split.

+0

C'était exactement le problème, ce qui rendait ces changements parfaitement fonctionnels. Merci! – wdow88

Questions connexes