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
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.