[win32][c][dev-c++] splitall gestionnaire de découpage / recollage de fichiers simple

Description

Voici un petit utilitaire sans grande prétention :)

Le but de cet utilitaire est de diviser des fichiers en morceaux de taille voulu

Les fonctionnalités / fonctionnement:

- découpage / recollage de fichier de taille en ko
- agencement dans une Listbox
- utilisation d'une dialog comme fenêtre principal
- gestion du drag and drop
- gestion du répertoire de destination (attention le même pour tous les fichiers)

j'ai essayé de commenter un maximum.

Pour exécuter le programme renommer le fichier "SplitAll.ex" en "SplitAll.exe"

Vos commentaires sont les bien venu :)

Source / Exemple :


//------------------------------------------------------------------------------
// Projet SplitAll      : découpage de fichier + recollage
// Auteur               : Hanteville Nicolas
// Fichier              : main.c
// Version              : 0.1
// Date de modification : 07/06/2007
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// gestion des includes
//------------------------------------------------------------------------------
#include "ressources.h"
//------------------------------------------------------------------------------
// nous renvoie le nom du fichier pour un chemin
char *StripNomDest(char *dest)
{
  //on se place a la fin de la chaine
  while(*dest) dest++;
  
  //on place le curseur au début du nom du fichier (situé aprèss le dernier / ou \)
  while(*dest != '\\' && *dest != '/') dest--;
  dest++;
  return  dest; 
}
//------------------------------------------------------------------------------
//fonctions de threads
//------------------------------------------------------------------------------
//découpe
DWORD WINAPI Decoupee(LPVOID lParam)
{
//nb items a traiter
    unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
    if (!max) return 0;
    
    unsigned int total = max;
    unsigned int i;
    DWORD copiee;
    char tmp[TAILLE_REP_FIC];
    
    GetWindowText(H_EDIT,tmp,TAILLE_REP_FIC);
    __int64 taille_fichier_sortie = _atoi64(tmp)*1024; //talle en koctet maximum par fichier
    __int64 taille_total;
    char item[TAILLE_REP_FIC];
    HWND Hsrc,Hdest;
    char buffer[taille_fichier_sortie];
    
    if (taille_fichier_sortie>0)
    {
    
    //on ouvre chacun des fichiers de la liste un par un
    while(max--){
       i=1;//numéro de nomage commence a 1
       
       //récupération du texte du 1er item
       SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
       
       //on ouvre le fichier 
       Hsrc= CreateFile(item,FILE_SHARE_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);

       if (Hsrc != INVALID_HANDLE_VALUE) 
       {
         taille_total = GetFileSize(Hsrc,NULL);
         
         while (taille_total>0 && Hdest!=INVALID_HANDLE_VALUE)
         {
           ReadFile(Hsrc, buffer, taille_fichier_sortie,&copiee, 0);
           
           snprintf(tmp,TAILLE_REP_FIC,"%s\\%s.%03d",DEstDEfaultTmp,StripNomDest(item),i++);
           
           Hdest= CreateFile(tmp,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
           if (Hdest==INVALID_HANDLE_VALUE)
             MessageBox(0,tmp,"Erreur de copie!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
           else
           {
             WriteFile(Hdest,buffer,copiee,&copiee,0);
           }
           CloseHandle(Hdest);
           
           taille_total-=copiee;
         }

       }else
         MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
        
        SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)(total-max)*100/total, 0);
       
        CloseHandle(Hsrc);
       
        //on supprime le 1er item
        SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
       }

    //progression
    SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
    }else
      MessageBox(0,"Il faut indiquer une taille minimum de fichier","Erreur!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
}
//------------------------------------------------------------------------------
//recoller
DWORD WINAPI Recollee(LPVOID lParam)
{
    //nb items
    unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
    if (!max) return 0;
    unsigned int total = max;
    char tmp[TAILLE_REP_FIC];
    char item[TAILLE_REP_FIC];
    DWORD copiee;
    
    //récupération du texte du 1er item
    SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
    snprintf(tmp,TAILLE_REP_FIC,"%s\\%s",DEstDEfaultTmp,StripNomDest(item));
    tmp[strlen(tmp)-4]=0; //on enlève l'extension  S01

    //ouverture du fichier de destination
    HWND Hdest= CreateFile(tmp,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
    
    if (Hdest != INVALID_HANDLE_VALUE)
    {
      HWND Hsrc;
      __int64 taille_fic=0;
      
      
      char *buffer;
      
      //gestion automatique
      //si un seul fichier a recoler on récupère les items automatiquement
      if  (max ==1)
      {
        int i=1;
        
          //progression
          SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)50, 0);  
          
          
          do{
            //génération du nom du fichier
            sprintf(item,"%s.%03d",tmp,i);
            
            //on ouvre le fichier 
            Hsrc= CreateFile(item,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
            
            //si ok on continue sinon méssage de choix
            if (Hsrc != INVALID_HANDLE_VALUE) 
            {
              //récupération de la taille du fichier
              taille_fic = GetFileSize(Hsrc,NULL);
              
              if (taille_fic>0)
              {
                 buffer = malloc(taille_fic);
                 
                 //on copie le comptenu du fichier dans le nouveau fichier / a la suite
                 ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
                 WriteFile(Hdest,buffer,copiee,&copiee,0);
    
                 free(buffer);
               }
            }
              
            CloseHandle(Hsrc);

            i++;
          }while (Hsrc != INVALID_HANDLE_VALUE);

          SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)100, 0); 
          //on supprime le 1er item
          SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);

      }else
      {
        while (max--)
        {
          
          //récupération du texte du 1er item
          SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)item);
          
          //on ouvre le fichier 
          Hsrc= CreateFile(item,GENERIC_READ,0,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          
          //si ok on continue sinon méssage de choix
          if (Hsrc != INVALID_HANDLE_VALUE) 
          {
            //récupération de la taille du fichier
            taille_fic = GetFileSize(Hsrc,NULL);
            
            if (taille_fic>0)
            {
               buffer = malloc(taille_fic);
               
               //on copie le comptenu du fichier dans le nouveau fichier / a la suite
               ReadFile(Hsrc, buffer, taille_fic,&copiee,0);
               WriteFile(Hdest,buffer,copiee,&copiee,0);
  
               free(buffer);
             }else
            MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
          
          }else
            MessageBox(0,item,"Erreur Fichier passé!!!",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
        CloseHandle(Hsrc);
        //on supprime le 1er item
        SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
        
        //progression
        SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)(total-max)*100/total, 0);

      };
    }
    }else
      MessageBox(0,"Erreur : reconstitution de fichier impossible !!!","Erreur",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
      
    //progression
    SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
    
    CloseHandle(Hdest);
}
//------------------------------------------------------------------------------
//gestion des appels et msg sur le fenêtre principale
HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam) 
{
 HDROP H_DropInfo;
 int nb,i;
 char *tmp;
  switch(Msg) 
  {
      case WM_INITDIALOG:
           InitCommonControls();
           
           //récupération des handl généraux
          H_EDIT          = GetDlgItem(hwnd,EDIT_TAILLE);
          H_LST           = GetDlgItem(hwnd,LST);
          H_PROGRESS_BAR  = GetDlgItem(hwnd,PROGRESS_BAR);
          
          //application d'une icone
          SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
          
          //init barre de progression
          SendMessage(H_PROGRESS_BAR, PBM_SETPOS, (WPARAM)0, 0);
      break;
      case WM_CLOSE:
          EndDialog(hwnd,0);  
          //PostQuitMessage(0);
      break;
      case WM_COMMAND :
           if ((LOWORD(Wparam) == BT_SUP) && (HIWORD(Wparam) == BN_CLICKED))
           {
             //suppression de la sélection
             SendMessage(H_LST,LB_DELETESTRING,(WPARAM)SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0),(LPARAM)0);
           }else if ((LOWORD(Wparam) == BT_PLUS) && (HIWORD(Wparam) == BN_CLICKED))
           {
             //emplacement du texte actuel
             int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
             
             if (nb>0)
             {
               tmp = malloc(TAILLE_REP_FIC);
               
               //récupération du texte sélectionné
               SendMessage(H_LST,LB_GETTEXT,(WPARAM)nb,(LPARAM)tmp);
               
               //suppression
               SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
               
               //insertion
               SendMessage(H_LST,LB_INSERTSTRING,(WPARAM)--nb,(LPARAM)tmp);
               
               //application de la sélection
               SendMessage(H_LST,LB_SETCURSEL ,(WPARAM)nb,(LPARAM)0);
               
               free(tmp);
             }
             
             
           }else if ((LOWORD(Wparam) == BT_MOINS) && (HIWORD(Wparam) == BN_CLICKED))
           {
             //emplacement du texte actuel
             int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
             int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
             
             if (nb>=0 && nb<(max-1))
             {
               tmp = malloc(TAILLE_REP_FIC);
               //récupération du texte sélectionné
               SendMessage(H_LST,LB_GETTEXT,(WPARAM)nb,(LPARAM)tmp);
               
               //suppression
               SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
               
               //insertion
               SendMessage(H_LST,LB_INSERTSTRING,(WPARAM)++nb,(LPARAM)tmp);
               
               //application de la sélection
               SendMessage(H_LST,LB_SETCURSEL ,(WPARAM)nb,(LPARAM)0);

               free(tmp);
             }
           }else if ((LOWORD(Wparam) == BT_RECOLLER) && (HIWORD(Wparam) == BN_CLICKED))
           {
                //recollage
                CreateThread(NULL, 0,Recollee,0,0,0);
                
           }else if ((LOWORD(Wparam) == BT_DECOUPE) && (HIWORD(Wparam) == BN_CLICKED))
           {
                //découpage
                CreateThread(NULL, 0,Decoupee,0,0,0); 
           }   
      break;
      case WM_DROPFILES:           
           
           tmp = malloc(TAILLE_REP_FIC);
           
           //récupération de la liste des fichiers sélectionnés + traitemen
           H_DropInfo=(HDROP)Wparam;//récupération de la liste
           
           //traitement : nb de fichier en drag
           nb=DragQueryFile(H_DropInfo, 0xFFFFFFFF, NULL, 0 );
           
           //demander emplacement de copie
            BROWSEINFO browser;
            LPITEMIDLIST lip;
          
            browser.hwndOwner = hwnd;
            browser.pidlRoot = 0;
            browser.lpfn = 0;
            browser.ulFlags = BIF_NEWDIALOGSTYLE; //permet l'option de création d'un dossier
            browser.lParam = 0;
            browser.pszDisplayName = DEstDEfaultTmp;  //résultat ici
            browser.lpszTitle = "Dossier de destination";
            lip = SHBrowseForFolder(&browser);
            if (lip != NULL) 
            {
               SHGetPathFromIDList(lip,DEstDEfaultTmp);

               for (i=0;i<nb;i++)
               {
                 DragQueryFile(H_DropInfo,i,tmp,DragQueryFile(H_DropInfo,i,0,0)+1 ); //récupération
                 SendMessage(H_LST,LB_ADDSTRING,(WPARAM)0,(LPARAM)tmp);
               }
               DragFinish(H_DropInfo);//libération de la mémoire
           }else
             MessageBox(0,"Erreur : répertoire de destination non valide !!!","Erreur",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
           free(tmp);
      break;
   }     
   return 0;        
}
//------------------------------------------------------------------------------
//fonction  principal (main)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow) 
{  
  Hinst = hInst;
  
  //création de la fenêtre
  DialogBox(0,MAKEINTRESOURCE(SplitAll),GetDesktopWindow(),(DLGPROC)DlgProc); 
   
  return 0;
}

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.