Code:
#include <stdio.h>
#include <stdlib.h>
long int GetFileSize(FILE *fp)
{
long int fileSize;
fseek(fp, 0, SEEK_END);
fileSize = ftell(fp);
rewind(fp);
return fileSize;
}
void GetFileInfo(char *filename, int *fileNameLen, int *fileSize)
{
FILE* fp;
fp = fopen(filename, "rb");
if(fp == NULL)
{
printf("No file handle\n");
sleep(3000);
exit(0);
}
*fileNameLen = strlen(filename);
*fileSize = GetFileSize(fp);
fclose(fp);
}
int main()
{
FILE* fp;
FILE* out;
char* buffer;
long int fileSize;
size_t result;
int i;
int numfiles = 2;
struct file
{
char *fileName;
int fileNameLen;
int fileSize;
}file[numfiles];
/* Get information regarding files to pack */
file[0].fileName = "Files.rar";
file[1].fileName = "files2.zip";
printf("Set filenames\n");
for(i = 0; i < numfiles; i++)
GetFileInfo(file[i].fileName, &file[i].fileNameLen, &file[i].fileSize);
printf("Gathered required information\n");
// Now write header information to the file
out = fopen("packed.bin", "wb");
if(out == NULL)
{
printf("No file handle\n");
sleep(3000);
exit(0);
}
printf("Open bin file\n");
for(i = 0; i < numfiles; i++)
{
printf("Entered loop %i\n", i);
// write filesize
if( fwrite(&file[i].fileSize, sizeof(file[i].fileSize), 1, out) != 1)
{
printf("Error writing file size header %i\n", i);
sleep(3000);
exit(0);
}
printf("Wrote file size header %i\n", i);
// write filename length
if( fwrite(&file[i].fileNameLen, sizeof(file[i].fileNameLen), 1, out) != 1)
{
printf("Error writing filename length header %i\n", i);
sleep(3000);
exit(0);
}
printf("Wrote filename length header %i\n", i);
// write filename
if( fwrite(file[i].fileName, 1, file[i].fileNameLen, out) != file[i].fileNameLen)
{
printf("Error writing filename header %i\n", i);
sleep(3000);
exit(0);
}
printf("Wrote filename header %i\n", i);
printf("Finished writing file header %i\n", i);
}
fclose(out);
// Open file
fp = fopen("Files.rar", "rb");
if(fp == NULL)
{
printf("Error reading file\n");
sleep(3000);
exit(0);
}
// obtain file size
fileSize = GetFileSize(fp);
printf("%i\n", fileSize);
// allocate memory for the whole file
buffer = (char*) malloc (sizeof(char)*fileSize);
if(buffer == NULL)
{
printf("Memory allocation error\n");
sleep(3000);
exit(0);
}
// copy file into the buffer
result = fread(buffer, 1, fileSize, fp);
if(result != fileSize)
{
printf("Could not load into memory\n");
sleep(3000);
exit(0);
}
// terminate
fclose(fp);
/* the whole file is now loaded in the memory buffer */
// write data to outfile
out = fopen("packed.bin", "ab");
if(out == NULL)
{
printf("No file handle\n");
sleep(3000);
exit(0);
}
if( fwrite(buffer, 1, fileSize, fp) != fileSize)
{
printf("Error writing file 1");
sleep(3000);
exit(0);
}
free(buffer);
fclose(out);
/* Read data from next file */
// Open file
fp = fopen("files2.zip", "rb");
if(fp == NULL)
{
printf("Error reading file\n");
sleep(3000);
exit(0);
}
// obtain file size
fileSize = GetFileSize(fp);
printf("%i\n", fileSize);
// allocate memory for the whole file
buffer = (char*) malloc (sizeof(char)*fileSize);
if(buffer == NULL)
{
printf("Memory allocation error\n");
sleep(3000);
exit(0);
}
// copy file into the buffer
result = fread(buffer, 1, fileSize, fp);
if(result != fileSize)
{
printf("Could not load into memory\n");
sleep(3000);
exit(0);
}
/* the whole file is now loaded in the memory buffer */
// terminate
fclose(fp);
// write data to outfile
out = fopen("packed.bin", "ab");
if( fwrite(buffer, 1, fileSize, fp) != fileSize)
{
printf("Error writing file 2");
sleep(3000);
exit(0);
}
free(buffer);
fclose(out);
sleep(3000);
return 0;
}
Now for reading in the data to re-write the files, or spliting into volumes, where to go from here?