Splitter de fichiers

Description

Salut a tous
Je vous propose comme premiere source un code tres original, le decoupeur (et recolleur en option ;) de fichiers
Je sais que c'est le genre de source pas tres original mais ça me tentais de faire un truc comme ça

Je compte sur vous pr me donner votre avis
toute remarque ou suggestion est la bienvenue
(je dirai que ce code est la verszion 0.8 ;)

ps: on ne pe creer qu'un rep !
c'est a dire on peut creer "c:\test" si test existe pas mais pas c:\test\test2 si ni test ni test2 existe (je pense corriger ça)

Source / Exemple :


// decoupe et recolle n'importe quel type de fichier //
//                  par fjxokt                       //

#include <fstream>
#include <stdio.h>
#include <fcntl.h>
#include <string>
#include <cstring>
#include <iostream>
#include <dirent.h>

using namespace std;

int main()
{

//definition des variables
    char filename[100];
    char filefinal[100];
    int choix;
    int tailleff, nbrparts;

    cout << "Voulez-vous decouper (1) ou recoller (2) un fichier ?\t";
    cin >> choix;

    if (choix == 1) {

        cout << "\nRentrez le fichier a decouper\n";
        cin.ignore(1,'\n');    //en cas d'espace ds les dossiers
        cin.getline(filename,100);
        cout << "Rentrez la taille des futurs fichiers en ko:\n";
        cin >> tailleff;

        int cle_de_fichier;     //recherche de la taille du fichier
        int taille_fichier;                       
        if ((cle_de_fichier = open(filename, O_RDONLY)) == -1)
             {
             printf("\aErreur a l\'ouverture du fichier %s\n", filename);
             return -1;
             }
             else
             {
             taille_fichier = filelength(cle_de_fichier);
             close(cle_de_fichier);
             }   

         tailleff*=1024; //transformation des octets en ko ;)

         nbrparts = round(taille_fichier/tailleff) + 1; //on arrondi au nombre de coupes + 1
         if ((nbrparts - 1) * tailleff == taille_fichier) { nbrparts = nbrparts - 1; } //ds le cas d'une division avec resultat sans virgule

         ifstream fin(filename, ios::binary | ios::in);  //on ouvre le fichier source en lecture binaire
         cout << "\nDecoupage en cours...\n";

         int tailletmp;
         for(int numero = 1; numero <= nbrparts; numero++)  //boucle pr le nombre de fichiers a creer
             {
              tailletmp = 0;
              sprintf(filefinal,"%s.%d", filename,numero);  //ajout des extension .1 etc au fichier
              cout << "creation de " << filefinal <<" ...\n";
              
                            ofstream fout(filefinal, ios::binary | ios::app); //ouverture des fichiers decoupes en binaire
                            char ch;                                         
                            while (fin.get(ch)) {
                                 if (numero == 1) {
                                  
                                  if (tailletmp < tailleff) {
                                                            fout << ch;     //et ecriture (je sais caractere par caractere c pas le mieux)
                                                            tailletmp++;
                                                            }
                                  else { 
                                  sprintf(filefinal,"%s.%d", filename,(numero + 1));                 
                                  ofstream fout(filefinal, ios::binary | ios::app );
                                  fout << ch;
                                  fout.close();

                                  break; }
                                  }
                                  else { 
                                  if (tailletmp < (tailleff - 1)) {
                                                            fout << ch; 
                                                            tailletmp++;
                                                            }
                                  else { 
                                  sprintf(filefinal,"%s.%d", filename,(numero + 1));
                                  ofstream fout(filefinal, ios::binary | ios::app );
                                  fout << ch;
                                  fout.close();

                                  break; }
                                  }
                             }
             fout.close();  //on ferme le fichier cree
             }

             fin.close();  //on ferme le fichier source
             cout << "\aDecoupage termine !\n\n";
    }

    else if (choix == 2) {
       
    int nbrsup;
    char fdec[100], fentier[100], chemin[100];
    unsigned short int supr;
    
    cout << "\nRentrez le chemin vers la premiere partie du fichier decoupe (sans le .01)\n";
    cin.ignore(1,'\n');
    cin.getline(fentier,100); 
    
    cout << "Ou voulez vous stocker le fichier final (sans le '\\' de fin de dossier) ?\n"; //pr des raison de facilité lol
    cin.ignore(0,'\n');
    cin.getline(chemin,100);
    
    if (opendir(chemin) == NULL) { cout << "Le dossier n'existe pas, creation de " << chemin << "\n"; mkdir(chemin); } //ne peut creer qu'un seul dossier attention !
    
    string chemin_ffinal = fentier;
    string chemin_cplt = chemin;
    
    size_t ext_pos2 = chemin_ffinal.find_last_of( '\\' );  //on recherche le nom du dossier ds la chaine
    if ( ext_pos2 != string::npos )
    {  
        
    string ext2( chemin_ffinal, ext_pos2 );
 
    cout << "\nRecollage en cours...\n";

    chemin_cplt += ext2; //chemin + nom du fichier

    ofstream fout(chemin_cplt.c_str(), ios::binary | ios::out); //creation et ouverture du fichier complet
    
    for (int num = 1; num >= 1; num++) { //boucle pr determiner le nombre de fichiers decoupes
        sprintf(fdec,"%s.%d", fentier ,num);
        ifstream fin(fdec, ios::binary | ios::in); //on ouvre les fichiers decoupes pr le recopiage
        if (!fin) { nbrsup = num; break; } //si le fichier num n'existe pas alors c'est qu'on a lus ts les fichiers decoupes
        else {
        cout << "boucle " << num << " lancee...\n";
        char ch;
        while (fin.get(ch)) {
                fout << ch;   //ecriture ds le fichier final
                }
                fin.close(); //on ferme
                }
        }
    fout.close();//on ferme
    
    cout << "\aRecollage termine !\n\n";
    
    cout << "Voulez effacer (1) ou conserver (2) les fichiers decoupes ?\t";
     cin >> supr;
    
     if (supr == 1) {
        for (int s = 1; s <= nbrsup; s++) {
                        sprintf(fdec,"%s.%d",fentier,s);                                       
                        remove(fdec);                   //suppresion (si desire) des fichiers decoupes
                        }   
        cout << "Nettoyage effectue !\n\n";                  
    }                                                                         
     else { cout << "\n"; }
    }
  }

  
  system("PAUSE");	
  return 0;
}

Conclusion :


ce n'est qu'un debut
je compte l'ameliorer et pe etre faire une version graphique

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.