1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
|
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <dirent.h>
#define STEP 15
FILE * Log; //Declaration fichier log
int ToCheck=0;
int Length=0;
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
int Project_Or_Not (char *FULLPATH)
//Cette fonction determine si un dossier est un projet ou pas
{
struct dirent *lecture; //|Déclaration de la structure qui contiendra le dossier en cours
DIR *rep; //|
char TEMP[256]; //Chaine temporaire
rep = opendir(FULLPATH); //Ouvre les sous dossiers de PATH
int sub=0;
while ((lecture = readdir(rep))) //|
{ //|
sprintf(TEMP,"%s",lecture->d_name); //|On lit le nom de chaque sous dossier
if (!strcmp(TEMP,"From_Cust")) sub++; //|Si il a un des noms suivant, on incrémente
if (!strcmp(TEMP,"To_Cust")) sub++; //|le compteur "sub".
if (!strcmp(TEMP,"WORK")) sub++; //|From_Cust, To_Cust, WORK, Admin
if (!strcmp(TEMP,"Admin")) sub++; //|sont des sous dossiers d'un projet
} //|
if (sub>=2) return 1;
return 0;
}
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
int Copy_wzzip (void)
//Cette fonction copie l'exe de winzip dans c:\windows\temp, afin de le lancer d'un chemin sans espace (pose des problèmes sinon)
{
system ("copy \"C:\\Program Files\\WinZip\\wzzip.exe\" c:\\windows\\temp"); //crée une copie de winzip dans c:\windows\temp
}
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
int Add_Folder (char * FULLPATH)
//Cette fonction zippera un dossier dont le chemin
{
int Code; //contiendra le code d'erreur
int i;
int j;
char NAME[strlen(FULLPATH)]; //Contiendra le nom du projet
char SHORTPATH[strlen(FULLPATH)]; //Contient le chemin sans le nom de projet
char CmdLine[strlen(FULLPATH)+40]; //Contiendra les Ligne de Commande passées au système
strcpy(SHORTPATH,FULLPATH);
for (i=(strlen(SHORTPATH)-1);i>=0;i--) //Cette boucle parcours la chaine a l'envers
{
if (SHORTPATH[i]=='\\') //si on tombe sur un "\" on va remplace
{
for (j=i+1;j<=strlen(SHORTPATH);j++) //Cette boucle extrait le nom de dossier
{
NAME[j-(i+1)]=SHORTPATH[j]; //Copie caractère par caractère
}
SHORTPATH[i]='\0';
i=-1;
}
}
//|preparation de la ligne
sprintf(CmdLine,"C:\\windows\\temp\\wzzip.exe -r -p -whs -en \"%s\\%s.zip\" \"%s\"", //|de commande qui lance
SHORTPATH,NAME,FULLPATH); //|la Compression
Code = system (CmdLine); //on recupere le code d'état renvoyé par la ligne de commande
//Ajouter la ligne qui efface le dossier
free(SHORTPATH); //|Liberation de l'espace memoire
free (CmdLine); //|reservé pour les chaines
free(NAME); //|
return Code; //retourne le code d'état
}
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
int arbo (char *PATH)
//Cette fonction parcoureras l'arborescence à la recherche de projets et essaiera de zipper les projets qu'elle trouve
//Prends le chemin du dossier à analyser en paramètre, et renvoie 1 si un projet a été archivé, 0 si aucun projet n'a été trouvé
{
int i=0;
int j;
int z=0;
int u=0;
char * CmdLine= malloc(sizeof(char));
char * FULLPATH = malloc(sizeof(char)); //Contiendra le chemin complet du dossier en cours
int * RESULTS=NULL; //contiendra une valeur associée a un dossier (RESULTS[i] associé a SubFolderNames[i])
int State; //Code d'état (zip+rd)
char **SubFolderNames = NULL; //Contient tous les sous dossiers du dossier en cours
char **FoldersNotZipped = NULL; //Contient les sous dossiers dont la valeur associée est 0
struct dirent * folder; //|Déclaration de la structure qui contiendra le dossier en cours
DIR *rep;
rep = opendir(PATH); //Ouvre les sous dossiers de rep
while ((folder = readdir(rep))) //boucle qui traite tous les sous dossiers
{
if (i%STEP ==2) {SubFolderNames = realloc (SubFolderNames, (i + STEP) * sizeof (char *));} //Assignation mémoire SubFolderNames
if (i>1) //si i=0 d_name=. et si i=1 d_name=.. (dans ces cas la procédure ne s'applique pas)
{
RESULTS=realloc(RESULTS, (i+1) * sizeof(int)); //assignation memoire RESULT
SubFolderNames[i] = malloc (strlen (folder->d_name) + 1); //Assignation mémoire SubFolderNames[i]
if (strlen(FULLPATH) < (strlen(SubFolderNames[i])+strlen(PATH)+1)) //|Assignation de mémoire
{ //|pour FULLPATH si plus grand que
FULLPATH= realloc (FULLPATH,(strlen(SubFolderNames[i])+ strlen(PATH)+1)*sizeof(char));
}
if (SubFolderNames[i] != NULL)
{
strcpy(SubFolderNames[i],folder->d_name); //On recupère le nom du ième sous dossier dans SubFolderNames
}
else {printf("\nNo more memory available\n"); system("pause"); }
RESULTS[i]=0;
sprintf(FULLPATH,"%s\\%s",PATH,SubFolderNames[i]); //On stocke le chemin du sous dossier en cours dans FullPATH
if (Project_Or_Not(FULLPATH) || !strcmp(SubFolderNames[i],"_Common")) //Si le sous dossier est un projet ou un dossier Common
{
State=Add_Folder (FULLPATH); //On le zippe
if (State!=0) {fprintf(Log,"%s\n",FULLPATH);State=0;} //si erreur pendant la compression -> log
else {
CmdLine = realloc (CmdLine, (strlen(FULLPATH)+20)* sizeof(char)); //memoire pour CmdLine
if (CmdLine!=NULL)
{
sprintf(CmdLine,"rd /S /Q \"%s\"",FULLPATH);State=system(CmdLine);//suppression du dossier
}
else {printf("\nNo more memory available\n"); system("pause"); }
}
if (State!=0) {fprintf(Log,"%s\n",FULLPATH);} //Si erreur pendant la supression ->log
RESULTS[i]=1;
}
else
{
if (opendir(FULLPATH))
{
RESULTS[i]=arbo(FULLPATH); //appelle la fonction sur les sous dossiers
}
else
{
RESULTS[i]=0;
}
}
} //fin de if (i>1)
i++;
}//Fin de la boucle qui traite les sous dossiers
if (i==1) return 0;//Si le dossier est vide on renvoie 0
//Cette boucle compte les 0 et les 1 renvoyés par l'appel de la fonction sur les sous dossier du dossier en cours
for (j=2;j<i;j++)
{
if (j%STEP ==2) {FoldersNotZipped = realloc (FoldersNotZipped, (j + STEP) * sizeof (char *));}
if (RESULTS[j]==0)
{
sprintf(FULLPATH,"%s\\%s",PATH,SubFolderNames[j]); //|On stocke le chemin du sous dossier en cours dans FullPATH
FoldersNotZipped[z]= malloc ((strlen(FULLPATH)+1)* sizeof(char));
if (FoldersNotZipped[z] != NULL)
{//On stocke les chemins associé a un 0 dans le tableau FoldersNotZipped
strcpy(FoldersNotZipped[z],FULLPATH); //On recupère le nom du ième sous dossier dans SubFolderNames
}
else {printf("\nNo more memory available\n"); system("pause"); }
z++;
}
else
{
u++;
}
}//fin de for (j=2;j<i;j++)
//Liberation des mémoires reservées
free (SubFolderNames);
free (RESULTS);
free (PATH);
//En fonction des valeurs renvoyées par les sous dossiers, on renvoie 1 , 0 ou on renvoie 1 et on log le nom de dossier
if (u==0) {free(FoldersNotZipped); return 0; }
if (z==0) {free(FoldersNotZipped);return 1; }
if (u!=0 && z!=0)
{
for (i=0;i<z;i++)
{
if (opendir(FoldersNotZipped[i])) {fprintf(Log,"%s\n",FoldersNotZipped[i]);}
ToCheck++;
}
free(FoldersNotZipped);
return 1;
}
}//fin de la fonction arbo
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
//---------------------------------------------------------------------------------------------------------------------------\\
int main (int argc, char *argv[])
{
char CmdLine[256];
clock_t
temps_initial, /* Temps initial en micro-secondes */
temps_final; /* Temps final en micro-secondes */
float
temps_cpu; /* Temps total en micro-secondes */
Log = fopen("c:\\windows\\temp\\log.txt", "w+"); //|
//|
if (Log == NULL) { //| Ouverture du fichier de logs
fprintf(stderr,"The Log file could not be created"); //|
system("pause");exit(-1); //|
}
Copy_wzzip(); //crée une copie de wzzip (sans espace dans le chemin)
temps_initial = clock (); //Prends l'heure de départ
arbo(argv[1]); //appelle la fonction qui parcours l'arborescence
fclose(Log); //Ferme le fichier de logs
temps_final = clock (); //Prends l'heure de fin
temps_cpu = (temps_final - temps_initial) * 1e-3; //calcule le temps ecoulé et le convertit en secondes
printf("\ntemps : %.2f\n",temps_cpu);
system ("del c:\\windows\\temp\\wzzip.exe");
if (ToCheck!=0){ sprintf(CmdLine,"Move \"c:\\windows\\temp\\log.txt\" \"%%USERPROFILE%%\\DESKTOP\\\""); system(CmdLine);}
system("PAUSE");
return 0;
} |
Partager