Aide pour un programme en C/C++ (compression en rar)

  • Auteur de la discussion shining666fr2
  • Date de début

shining666fr2

Expert
Voici un programme que j'ai réalisé avec un batch:

Il sert a prendre un répertoire ensuite à le compresser et à le coller ailleurs. Exemple: je prend le répertoire toto dans c:\toto je le compresse en toto.rar et je le colle dans D:\

Je débute la programmation et j'essaie de reproduire ce programme en langage C (je l'ai mis en bas). J'ai pu reproduire le début mais je ne sais pas comment lancer une compression. Pouvez-vous m'aiguiller ? J'ai fait pas mal de recherche avec google mais aucun résultat.


Code:
BATCH
 
@echo off  
color E
echo.
echo.
echo BIENVENUE DANS LE PROGRAMME DE COMPRESSION/DEPLACEMENT  
echo.
echo.
echo======================================================
echo.
echo  ****** [VERSION 1.0 Createur: XXXXXXXX] *******  
echo.
echo======================================================
echo.
echo.
rem ATTENTION COPIER BIEN LE FICHIER RAR.EXE DANS SYSTEM32
 
:menu
 
set /p VAR=DONNER LE CHEMIN D ACCES DE VOTRE REPERTOIRE A COMPRESSER (EXEMPLE C:\toto) ?
echo.
 
set /p VAR2=ENTRER LE NOM QUE VOUS VOULEZ POUR VOTRE FICHIER COMPRESSE (toto.rar) ?
echo.
 
set /p VAR3=DONNER LE CHEMIN D ACCES DU REPERTOIRE CIBLE (EXEMPLE \\192.168.1.1\toto) ?
echo.
echo.
echo -- CHEMIN D ACCES DU REPERTOIRE A COMPRESSER --
echo.
echo %VAR%
echo.
echo -- NOM DU FICHIER COMPRESSE --
echo.
echo %VAR2%
echo.
echo -- CHEMIN DU REPERTOIRE CIBLE --
echo.
echo %VAR3%
echo.
echo.
ECHO AVEZ VOUS BIEN RENTRE VOS CHEMINS D ACCES ?
echo.
ECHO 1) OUI  
echo.
ECHO 2) NON  
ECHO.  
 
rem variable d'environnement (paramètre /P obligatoir)  
set /p choix= VEUILLEZ ENTRER UN CHOIX S IL VOUS PLAIT (1 ou 2) :  
 
if not %choix%=='' set choix=%choix:~0,1%  
if %choix%==1 goto OUI  
if %choix%==2 goto NON  
 
retour au menu principale a cause d'un mauvais choix ou une faute de frappe  
echo %choix% N EST PAS CORRECT !  
goto menu  
 
 
:OUI
 
rar a -m3 "%VAR2%" "%VAR%"
 
move /y "%VAR2%" "%VAR3%"
 
:NON
echo.
echo.
goto menu
 
pause

LANGAGE C

[cpp]

#include <iostream>

using namespace std;
int main(int argc, char *argv[])

{
printf (" *** BIENVENUE DANS LE PROGRAMME DE COMPRESSION/DEPLACEMENT *** \n\n\n" );
printf (" ========================================================\n" );
printf (" == ****** [VERSION 1.0 Createur: XXXXXX] ******* == \n" );
printf (" ========================================================\n\n\n\n" );
{
/*ATTENTION COPIER BIEN LE FICHIER RAR.EXE DANS SYSTEM32*/

char var1[25] ="";
char var2[25] ="";
char var3[25] ="";
int var4 = 0;

printf("DONNER LE CHEMIN D ACCES DE VOTRE REPERTOIRE A COMPRESSER [EXEMPLE C:toto] ?\n" );
scanf("%s", &var1);
printf("\n" );
printf("ENTRER LE NOM QUE VOUS VOULEZ POUR VOTRE FICHIER COMPRESSE [toto.rar] ?\n" );
scanf("%s", &var2);
printf("\n" );
printf("DONNER LE CHEMIN D ACCES DU REPERTOIRE CIBLE ?\n" );
scanf("%s", &var3);
printf("\n" );
printf("Le chemin d acces de votre repertoire est : %s\n", var1);
printf("\n" );
printf("Le nom que vous desirez pour votre fichier est : %s\n", var2);
printf("\n" );
printf("Le chemin d acces du repertoire cible est : : %s\n", var3);
printf("\n" );
printf("Avez vous bien rentre vos chemins d acces ?\n\n" );
printf("0|OUI\n\n" );
printf("1|NON\n\n" );
scanf("%d", &var4);
printf("QUE VAUT VAR %d\n", var4);
if (var4)
printf("PASOK\n" );
else
printf("OK\n" );


}

return 0;
}


[/cpp]


J'ai lu et réalisé tout les programmes d'exemples présent sur le siteduzero.fr malheureusement il n'aborde que le début de la programmation (les printf, les scanf, %d, %s, char, int etc...) Tout ça j'ai compris.

Maintenant je cherche a créer mon programme qui fonctionne très bien en batch en C.

Je ne sais pas comment lancer une compression en rar (ou zip) en langage C. Quelqu'un peut m'aider ? J'ai juste besoin de ça pour moi c'est compliqué car je connais pas encore mais pour vous je pense que c'est simple.

Merci d'avance pour votre futur aide. Je me répète je débute soyez indulgent ^^.
 

Storos

Modérateur cochon
Staff
1. Je te conseille de respecter le règlement de la rubrique et d'éditer ton message(c'est l'icône en bas à droite du message avec une feuille barrée d'un éclair) pour présenter correctement ton code en l'encadrant avec la balise
Code:
. [:storos:7]

2. Je ne comprend pas trop pourquoi tu tiens absolument à faire en langage C quelque chose qui fonctionne bien en batch. :spamafote:

3. Tu devrais te renseigner sur la commande "system" (et ne pas oublier que stdio.h est ton ami)... :whistle:
 

shining666fr2

Expert
Désolé j'ai posté un peu trop vite, normalement ça devrait être bon.

Alors je tiens à faire du langage C pour deux raisons. Premièrement et je veux apprendre à créer des programmes en langage C donc cette exemple de création de programme me convient parfaitement et dans un second temps (qui est encore très éloigné je pense) je veux réaliser un programme avec du graphisme un peu évolué qu'une fenêtre dos. Je pense que ce sera plus facile en C qu'en batch.

Depuis ce matin je cherche et j'ai testé cette commande

system ("rar VAR2 VAR1");

move /y ("VAR2 VAR3");

La partie system le debugger a l'air de la prendre en compte par contre le move (que j'ai repris de mon batch) y connait pas.

Saurais tu quelle commande je peux utiliser pour déplacer mon fichier rar créé ? Car encore une fois google n'est pas mon ami j'ai rien trouvé.

Si tu as des bons tuyaux ou des bons sites ou je puisse apprendre je suis preneur (le siteduzero m'a déjà beaucoup aidé)

En tout les cas merci pour ta réponse
 

Storos

Modérateur cochon
Staff
"move" n'est pas une fonction C valide... :spamafote:

Mais "system" en est une! :whistle:

Tu as essayé de lancer ton move avec la commande "system"? :whistle:

C'est fou ce qu'on peut faire avec "system"... :p

Mais tu ne vas obtenir que la traduction d'un script: cela n'a pas grand chose à voir avec de la vrai programmation C... :/
 

zeb

Modérateur
Salut,

La fonction system() permet d'exécuter une commande comme tu la taperais sur la ligne de commande du système.

Pour exécuter un programme externe en C, on utilise les fonctions exec**().

Pour copier un fichier (déplacer un fichier, c'est le copier puis le supprimer ;) ), utilise les fonctions fread() et fwrite() (excellent exercice, puisque tu te formes) ou directement les API Windows.

La fonction scanf() est à prohiber. Apprends à te servir de fgets() à la place.
 

Storos

Modérateur cochon
Staff
Je ne peux qu'approuver ce que tu dis zeb, mais fread() et fwrite() ne lui permettront pas de créer ou d'effacer un répertoire... :/

Si? :??:

La fonction system est effectivement une méthode "brutale" et peu élégante mais pour traduire un batch, elle est la plus simple à utiliser... Même si dans l'optique d'apprendre le C j'aurais utilisé autre chose qu'un script qui ne présente que peu d'intérêt en C... :sweat:

Et puisqu'on en est à critiquer le scanf(), il faudrait ajouter que le printf() est quand même un peu archaïque: j'utiliserais plutôt un cout... :p

EDIT: Et pourquoi pas un cin à la place du fgets au point où on en est? ;)
 

zeb

Modérateur
Parce que tu confonds le C et le C++, petit goret !

Les fread() et fwrite() sont pour copier le fichier rar de C: vers D:
A charge de shining666fr2 de trouver (en demandant à google ou à nous, par exemple) comment supprimer le fichier.
 

Storos

Modérateur cochon
Staff
Gruik! [:storos:6]

Mais le libellé de la question indique bien C/C++, non? :whistle:
 

batchy

Grand Maître
À mon avis, Ça marchera pas, ou peut être qu'il à déjà essayé et que ça marche effectivement pas.

Du bon vieux temps sous ms-dos, move était l'une des commandes indispensables qui n'était pas interne (alors que toutes les autres, cd, copy, dir ... l'était. dieu sait pourquoi)
Depuis, il me semble que move est une commande interne, donc ça marchera pas avec system(), au même titre que "dir" et "copy".

La solution ? le plus simple c'est sans doute de mettre le RAR au bon endroit dès le début. Mais si on veut absolument utiliser move, même si c'est pas une bonne idée, alors
faut lancer cmd avec un switch pour lui dire de n'éxecuter que cette commande, j'me souviens plus du switch, ça doit être /C je crois. si c'est le cas,
Code:
system("cmd /c move ton.rar ton\repertoire");
 

zeb

Modérateur
Non mais le langage C est pour vous si complexe qu'il faille faire appel au DOS pour déplacer un fichier ?

:heink:
 

shining666fr2

Expert
Code:
Code :


#include <iostream>
#include <stdio.h>


int main(void){
	printf (" *** BIENVENUE DANS LE PROGRAMME DE COMPRESSION/DEPLACEMENT *** \n\n\n");
	printf ("    ========================================================\n");
	printf ("    == ****** [VERSION 1.0 Createur: XXXXXX] ******* == \n");
	printf ("    ========================================================\n\n\n\n");

	/*ATTENTION COPIER BIEN LE FICHIER RAR.EXE DANS SYSTEM32*/

	char var1[50] ="";
	char var2[50] ="";
	char var3[50] ="";
	char buf[259] ="";
  
	int var4 = 0;
	int quitNow=0;
	while((quitNow==0)||(var4==0){
  		printf("Entrer le chemin d acces de votre fichier a compresser [EXEMPLE C:\\toto] ?\n");
 		scanf("%s", &var1);
  		printf("\n");
  		printf("Entrer le nom que vous voulez donner a votre fichier compresse [toto.rar] ?\n");
  		scanf("%s", &var2);
  		printf("\n");
  		printf("Donner le chemin d acces du repertoire cible ?\n");
  		scanf("%s", &var3);
  		printf("\n\n");
  		printf(" ================ RECAPITULATIF ================ ");
  		printf("\n\n");
  		printf("Le chemin d acces de votre repertoire est : %s", var1);
  		printf("\n\n");
  		printf("Le nom que vous desirez pour votre fichier est : %s", var2);
  		printf("\n\n");
  		printf("Le chemin d acces du repertoire cible est : %s", var3);
  		printf("\n\n");
  		printf(" ================================================ ");
  		printf("\n\n");
  		printf("Confirmer ? \n\n");
  		printf("\n");
  		printf("0 | Oui\n\n");
  		printf("1 | Non\n\n");
	
  		scanf("%d", &var4);
  		printf("\n\n");	
		
		if (var4==0){
     		printf("La compression de %s va commencer\n", var1);
      		printf("\n\n");
			sctrcpy(buf,"C:\\Program Files (x86)\\WinRAR\\rar.exe a -m3 ", 47);
			strcat(buf,var2,strlen(var2)-1);
			strcat(buf,32,1);
			strcat(buf,var1,strlen(var1)-1);
			system (buf);
			sctrcpy(buf,"move /y",7);
			strcat(buf,var2,strlen(var2)-1);
			strcat(buf,32,1); /* 32 correspond au caractere ASCII de l'espace*/
			strcat(buf,var3,strlen(var3)-1);
			system (buf);
			return 0;
		}
		else	{
			printf("Quitter ? \n\n");
			printf("\n");
			printf("1 | Oui\n\n");
			printf("0 | Non\n\n");
	  		scanf("%d", &quitNow);
			}
	}
	return 0;
}

Pour l'instant j'en suis la mais j'ai encore des bugs... mais ça va venir
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 827
Membres
1 586 367
Dernier membre
ramkin
Partager cette page
Haut