begin process at 2008 07 05 07:14:10
1 205 054 membres
40 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SPLITTER DE FICHIERS


Information sur la source

Catégorie :Fichiers / Disque Niveau : Débutant Date de création : 28/01/2005 Date de mise à jour : 31/01/2005 18:11:41 Vu / téléchargé: 2 734 / 126

Note :
Aucune note

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

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

  • // 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;
  • }
// 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
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • dec_rec.exeTélécharger ce fichier [Réservé aux membres club]458 114 octets
  • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier6 620 octets

Télécharger le zip

28 janvier 2005 20:27:25 :
28 janvier 2005 23:20:54 :
31 janvier 2005 18:11:41 :
transformation des octets en ko desormais "exacte" (sur un commentaire de ymca2003 )
  • signaler à un administrateur
    Commentaire de BruNews le 28/01/2005 18:51:48 administrateur CS

    Salut,
    si tu sais déjà qu'on ne traite pas un fichier octet par octet alors pourquoi tu nous mets cela ici ?

  • signaler à un administrateur
    Commentaire de fjxokt le 28/01/2005 20:22:12

    parsque en attente que je corrige ça, le code marche quand meme (heureusement !)  et je ne pense pas qu'il soit tres lent (enfin ça c'est a vous de le dire ;)

  • signaler à un administrateur
    Commentaire de ymca2003 le 31/01/2005 10:04:56

    tailleff*=1000; //transformation des octets en ko

    => 1 ko = 1024 octets et pas 1000.

  • signaler à un administrateur
    Commentaire de fjxokt le 31/01/2005 16:53:31

    soit c'est vrai mais si quelqu'un veut decouper un fichier de 20ko en fichiers de 10, il est plus "logique" de creer des fichiers de 10000octets chacun que un de 1024 et l'autre de 976 octet (a vous de voir ;)

  • signaler à un administrateur
    Commentaire de ymca2003 le 31/01/2005 17:02:26

    un fichier de 20 ko découpé en 2 donnera 2 fichiers de 10 Ko soit 10240 octets (10*1024).

    20Ko = 20480 octets et non pas 20000.

    et 10000 octets = 9.76 ko.

    Cela n'a rien a voir avec une "logique" (de pensée en tant cas parce qu'au point de vu binaire ça l'est de penser en puissance de 2) c'est comme ça qu'on compte en octets...

  • signaler à un administrateur
    Commentaire de fjxokt le 31/01/2005 17:35:17

    ok je comprend
    (pr ce qui est du resultat que ça donne avec mon programme, je ne vois pas de difference, mais bon ça doit etre pq je m'embrouille)

  • signaler à un administrateur
    Commentaire de fjxokt le 24/02/2005 22:51:27

    Voila apres une periode dinactivité, j'aimerai améliorer ma source.
    Cependant, je ne sait pas trop comment proceder afin de copier les donnees autrement que octet par octet.
    Si quelqu'un avait des suggestions pour m'aider !

  • signaler à un administrateur
    Commentaire de BruNews le 24/02/2005 23:31:05 administrateur CS

    Au moment du splitt tu alloues par exemple un buffer de 32 Ko et tu boucles dessus.

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS