salut à tous
En fait je fais un splitter de fichier mais j'ai un probleme. il me rajoute 1 octet sur la découpe et 1 octet par fichier pour la reconstitution.
Je pense que la c dans dans les boucles que je dois merder. pourtant seulement un caractere est rajouté dans la découpe même si il se découpe en 4 fichiers.
Si vous pouvez m'aider ça serait cool
Merci
24.KaraS
--->
G une fenêtre qui possede une textbox pour saisir le nom du fichier à couper ou à coller.
une autre textbox pour saisir la taille de découpe
et 2 checkbox pour savoir si on veux couper ou coller.
Et il y a le bouton (ID_lancer) pour éxécuter.
---->le source
#include <windows.h>
#include <stdlib.h>
#include "resource.h"
#include<stdio.h>
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);
HINSTANCE hInstance_recup; //variable globale pour utiliser hinstance dans
//le traitement des messages
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hDlg;
hDlg=CreateDialog(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)MainProc);
ShowWindow(hDlg,SW_SHOW);
MSG msg;
//récupération de hinstance pour le traitement des messages
hInstance_recup = hInstance;
//gestion des messages
while(GetMessage(&msg,hDlg,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
char chemin[250]= {".\\"}; //chemin du fichier source
char chemin_final[250]= {" "}; //chemin des fichiers à créer
char tailles[10]= {" "}; //nom du film
int taille=0; //conversion de la taille saisie en entier
FILE *source,*destination; //fichier à lire
int num =0; //indice du numero de fichier créé
char tampon[2] = {" "};
int nb=0; //nombre de caracter lu pour chaque fichier
int lu=0; //retour de la fonction fread
char numstr[20] = {" "};
bool fin=false; //variable pour la fin de la reconstitution
int ecrit = 0;
//gestion des messages
int Select;
switch(message)
{
// Saisie du deplacement de la fenetre par un clic continu sur celle ci
case WM_LBUTTONDOWN:
SendMessage(Dlg,WM_NCLBUTTONDOWN, HTCAPTION,0);
break;
//boutons
case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{
//bouton lancer
case IDLANCER:
//rien n'est coché
if ( SendMessage (GetDlgItem (Dlg,ID_COLLER),BM_GETSTATE,0,0) == BST_UNCHECKED
&& SendMessage (GetDlgItem (Dlg,ID_COUPER),BM_GETSTATE,0,0) == BST_UNCHECKED)
{
MessageBox (0,"Veuillez cocher une case","Erreur",0);
break;
}
//tout est coché
if ( SendMessage (GetDlgItem (Dlg,ID_COLLER),BM_GETSTATE,0,0) == BST_CHECKED
&& SendMessage (GetDlgItem (Dlg,ID_COUPER),BM_GETSTATE,0,0) == BST_CHECKED)
{
MessageBox (0,"Veuillez cocher une seule case","Erreur",0);
break;
}
//On coupe ?
if (SendMessage (GetDlgItem (Dlg,ID_COUPER),BM_GETSTATE,0,0) == BST_CHECKED)
{
GetDlgItemText (Dlg,IDC_CHEMIN,chemin,250); //recup chemin
GetDlgItemText (Dlg,IDC_TAILLE,tailles,10); //recup taille
taille = atoi (tailles); //conversion en entier
taille *= 1000; //on met la taille en Ko
//on ouvre le fichier à couper
source = fopen(chemin,"rb");
//on concatène le nom du fichier avec .part
strcat (chemin,".part");
//tant que ce qu'on lit = ce qu'on doit lire (do while)
do
{
//on doit changer le nom de fichier pour la découpe
if ( (nb == 0) | (nb == taille) )
{
//on initialise la variable de caractere lu
nb = 0;
//on incrémente la variable du fichier
num++;
strcpy (chemin_final,chemin);
//on la concatène avec le nom global : nom.part
itoa (num,numstr,10);
strcat (chemin_final,numstr);
//on crée le fichier destination
destination = fopen (chemin_final,"wb");
fclose (destination);
}
//on lit le fichier source
fread (tampon,sizeof(char),1,source);
nb ++;
//on ouvre le fichier destination à la fin
if ((destination = fopen (chemin_final,"ab")) == NULL)
{
destination = fopen (chemin_final,"wb");
}
//on écrit le fichier destination
fwrite(tampon,sizeof(char),1,destination);
//on ferme le fichier destination
fclose (destination);
//on test la fin du fichier source
}
while (!feof (source));
//on ferme le fichier source
fclose (source);
//on affiche un message
MessageBox (0,"Le fichier a été découpé","Succés",0);
}
//On colle ?
if (SendMessage (GetDlgItem (Dlg,ID_COLLER),BM_GETSTATE,0,0) == BST_CHECKED)
{
GetDlgItemText (Dlg,IDC_CHEMIN,chemin,250); //recup chemin
//ouvre le fichier destination à créer
destination = fopen(chemin,"wb");
//on concatène le nom du fichier avec .part
strcat (chemin,".part");
//tant qu'il y a des fichiers à coller
while (fin != true )
{
//on augmente l'indice du fichier à lire
num++;
//on recopie le chemin pour ne pas le modifier
strcpy (chemin_final,chemin);
//on concatène le nom avec l'indice
itoa (num,numstr,10);
strcat (chemin_final,numstr);
//On ouvre chaque fichier source 1 par 1
if ((source = fopen (chemin_final,"rb")) != NULL )
{
//tant qu'il y a des données
while (!feof(source))
{
//lecture du fichier
fread (tampon,sizeof(char),1,source);
//ecriture du fichier
fwrite (tampon,sizeof(char),1,destination);
}
//on ferme le fichier source
fclose (source);
}
else
{
//on quitte la boucle
fin = true;
}
} //fin du while
//on ferme le fichier destination
fclose (destination);
//on affiche un message
MessageBox (0,"Le fichier a été recollé","Succés",0);
}
return TRUE;
//bouton quitter
case IDCANCEL:
EndDialog(Dlg,Select);
PostQuitMessage(0);
return TRUE;
//bouton a propos
case IDABOUT:
MessageBox (0," Codé par 24.KaraS\n\n Greetz\n Kheo pour la ressource ;-)\n MinoS pour les cours de crack","A propos",0);
return TRUE;
}
default:
return FALSE;
}
return 0;
}