codice:
/**
* BCC32
* MinGW
**/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define EXTENSION ".part"
#define SINTAX_ERROR "Hai digitato male il comando o uno dei parametri"
#define READ_ERROR "Errore di lettura dal file indicato"
#define BUFF_LN 50
#define OK 0
#define KO 1
/** Concatena il numero con l'estenzione
* param num numero del file
* param *str2 stringa da concatenare
* return nome file, composto da un numero identificativo ed estensione
**/
char *strConcat( unsigned long int num, const char *str2)
{
char *str, str1[BUFF_LN];
unsigned int i, j; // Unsigend int :-)
itoa(num, str1, 10);
str=(char *)calloc(sizeof(char), strlen(str1)+strlen(str2)+1);
assert(str!=NULL);
for(i=0; i<strlen(str1); i++)
str[i]=str1[i];
for(j=0; j<strlen(str2); j++)
str[i+j]=str2[j];
str[i+j]='\0';
return str;
} // strConcat
/** controla se un file esiste
* param nomeFile il nome del file
* return OK se il file esiste, altrimenti KO
**/
int fileExist( const char *nomeFile)
{
FILE *file;
if( (file=fopen(nomeFile, "r+b") )==NULL)
return KO;
fclose( file );
return OK;
} // FileExist
/** La funzione taglia il file originale in file + piccoli con dimensione scelta
* param pesoFile dimensione di ogni parte del file in byte
* param nomefile[] nome del file di input
* return esito dell'elaborazione
**/
int split( unsigned long int pesoFile, char *nomeFile)
{
FILE *in, *out;
char buff;
unsigned long int contaByte=0;
unsigned long int contaFile=0;
if( ( in=fopen(nomeFile, "rb") )==NULL )
{
printf("%s", READ_ERROR);
return 1;
} // Apertura file di input
while( !feof(in) )
{
if( ( out=fopen( strConcat(contaFile, EXTENSION), "wb") )==NULL )
{
printf("%s", READ_ERROR);
fclose(in);
return 1;
} // Apro un nuovo out ogni volta
while( contaByte<pesoFile )
{
fread(&buff, sizeof(char), 1, in);
if( feof(in) ) break;
fwrite(&buff, sizeof(char), 1, out);
contaByte++;
} //end while fino ache non finisco i byte per questa parte
contaByte=0;
contaFile++;
fclose(out);
} //end while
fclose(in);
fclose(out);
return 0;
}// Split
/** La funzione unisce in un unico file le parti trovate
* return dell'esito dell'elaborazione
**/
int join(char nomeFile[])
{
FILE *in, *out;
char buff;
unsigned long int contaFile=0;
printf("\nJoin file>%s\n", nomeFile);
// getch();
if( (out=fopen( nomeFile, "ab") )==NULL )
{
printf("%s", READ_ERROR);
return 1;
} // Apertura file di output
do
{
if( (in=fopen( strConcat(contaFile, EXTENSION), "rb") )==NULL)
{
printf("%s",READ_ERROR);
fclose(out);
return 1;
} // Apro un nuovo out ogni volta
do
{
fread(&buff, sizeof(char), 1, in);
if( feof(in) ) break;
fwrite(&buff, sizeof(char), 1, out);
} // End while fino a che non finisco i byte per questa parte
while( 1 );
fclose(in);
}
while( !fileExist( strConcat(++contaFile, EXTENSION) ) );
fclose(in);
fclose(out);
return 0;
}// Join
void help()
{
printf("\nSplit & join\n");
printf("Uso:\n\n");
printf("Split [-s | -j] [numeroBytePerParte] nome file\n\n");
printf("Per dividere un file\n");
printf(" Split [-s] numeroBytePerParte nomeFile \n\n");
printf("Per unire più file in uno solo:\n");
printf(" Slit [-j] nomeFile \n");
return;
}
int main(int argc, char *argv[])
{
if(argc<2)
{
help();
return 0;
}
if(!strcmp(argv[1], "-s"))
{
printf("Split del file \"%s\" in parti da %dk", argv[3], atoi( argv[2] ) );
if(atoi(argv[2])>0)
{
split( atoi( argv[2]), argv[3]);
printf("Operazione complatata");
return 0;
}
}
if(!strcmp(argv[1], "-j"))
{
// printf("Join del file \"%s\" param = %dk", argv[2], atoi( argv[1] ) );
printf("Unisco le parti");
join( argv[2] );
return 0;
}
printf("\n%s", SINTAX_ERROR);
help();
return 0;
} // main
Ora il file 'ricompattato' è uguale al file originale