/* C source file: spliter.c */ /* Spliter, a program to split and merge files.
* Written by linuxqc@gmail.com
* This is version 1.1.3 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char nameinputt[80]; /* The name of the input file */
char namebefdot[76]; /* Parts of the name of the input file before the dot */
char nameaftdot[20]; /* Parts of the name of the input file after the dot */
char namenew[60][80] = { {""} }; /* The final names of the output files */
char namefile[61][80] = { {""} }; /* The data structure for saving the file names in the data_file_names file */
char namedest[61][80]; /* Used by the merge() function to creat file names */
void destname(int f)
{ /* Creat the output files' names */
int i, j, k;
char buffer[20];
for (i = 0; i < 80; i++) {
if (nameinputt[i] == '.')
break;
namebefdot[i] = nameinputt[i];
}
for (j = 0, k = i; k < 80 && j < 20; k++, j++) {
nameaftdot[j] = nameinputt[k];
}
strcat(namenew[f], namebefdot);
strcat(namenew[f], itoa(f, buffer, 10));
strcat(namenew[f], nameaftdot);
}
int changename(int f)
{
f += 1;
return f;
}
long filelen(char *filename)
{ /* Get the size of the file */
FILE *v_fpLog = NULL;
long fSet = 0, fEnd = 0;
long filelen = 0;
if ((v_fpLog = fopen(filename, "r+")) == NULL) {
printf("The file '%s' was not opened", filename);
return 0;
}
else {
fseek(v_fpLog, 0, SEEK_SET);
fSet = ftell(v_fpLog);
fseek(v_fpLog, 0, SEEK_END);
fEnd = ftell(v_fpLog);
/* file lenght */
filelen = (fEnd - fSet) / 1024;
}
return filelen;
}
void savename(char *nameinputt, int count)
{ /* Save file names in data_file_names */
FILE *fp;
int i, j, k, position;
char full_path_name[255];
char file_name[255];
for (i = 0; i < 255; i++) {
full_path_name[i] = '\0';
}
for (i = 0; i < 255; i++) {
file_name[i] = '\0';
}
position = 0;
i = 0;
while (nameinputt[i] != '\0') {
if (nameinputt[i] == '\\') {
position = i;
}
i++;
}
for (i = 0; i < position; i++) {
full_path_name[i] = nameinputt[i];
}
strcat(full_path_name, "\\");
strcat(full_path_name, "data_file_names");
if ((fp = fopen(full_path_name, "w")) == NULL) {
printf(" Error: can't create the data file 'data_file_names'.\n");
exit(0);
}
for (j = 0; j < 80; j++)
namefile[count][j] = nameinputt[j];
while (nameinputt[i] != '\0') {
if (nameinputt[i] == '\\') {
position = i;
}
i++;
}
for (i = 0; i <= count; i++) {
j = 0;
k = position + 1;
while (namefile[i][k] != '\0') {
file_name[j] = namefile[i][k];
k++;
j++;
}
file_name[j] = '\0';
fprintf(fp, "%s\n", file_name);
}
fclose(fp);
}
void savesize(char *nameinputt, long int size)
{ /* Save size of the file in data_file_size */
FILE *fp;
int i, position;
char full_path_size[255];
for (i = 0; i < 255; i++) {
full_path_size[i] = '\0';
}
position = 0;
i = 0;
while (nameinputt[i] != '\0') {
if (nameinputt[i] == '\\') {
position = i;
}
i++;
}
for (i = 0; i < position; i++) {
full_path_size[i] = nameinputt[i];
}
strcat(full_path_size, "\\");
strcat(full_path_size, "data_file_size");
if ((fp = fopen(full_path_size, "w")) == NULL) {
printf(" Error: cant' create the data file 'data_file_size'.\n");
exit(0);
}
fprintf(fp, "%ld", size);
fclose(fp);
}
int readname(char *directory)
{ /* Get file names from data_file_names */
FILE *fp;
int i = 0, j;
int count;
char *p;
char full_file_name[255];
strcpy(full_file_name, directory);
strcat(full_file_name, "\\");
strcat(full_file_name, "data_file_names");
if ((fp = fopen(full_file_name, "r")) == NULL) {
printf(" Error: the data file named 'data_file_names' is not in the directory.\n");
exit(0);
}
while (fgets(namedest[i], 80, fp) != NULL) {
p = strchr(namedest[i], '\n');
if (p)
*p = 0;
i++;
}
for (j = 0, count = 0; j < 61; j++) {
if (namedest[j][0] != '\0')
count++;
}
fclose(fp);
return count - 1;
}
long int readsize(char *directory)
{ /* Get the size of the file from data_file_size */
FILE *fp;
long int size;
char full_file_name[255];
strcpy(full_file_name, directory);
strcat(full_file_name, "\\");
strcat(full_file_name, "data_file_size");
if ((fp = fopen(full_file_name, "r")) == NULL) {
printf(" Error: the data file named 'data_file_size' is not in the directory.\n");
exit(0);
}
fscanf(fp, "%ld", &size);
fclose(fp);
return size;
}
int split(char *nameinputt, long int size)
{ /* The function to split */
FILE *in, *out;
int i;
int f = 0, k, times;
int ch, flag;
long int len;
int per;
if ((in = fopen(nameinputt, "rb")) == NULL) {
printf("-------------------------------------------------------------------------------\n");
printf(" Error: can not open input file, please check if you have entered the right file name.\n");
printf("-------------------------------------------------------------------------------\n");
exit(0);
}
len = filelen(nameinputt);
printf("-------------------------------------------------------------------------------\n");
printf("\n Spliting...please wait.\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 0%% has been done.\n");
printf(" The output files are:\n");
while (!feof(in)) {
destname(f);
for (k = 0; k < 80; k++)
namefile[f][k] = namenew[f][k];
printf(namenew[f]);
printf("\t");
if ((out = fopen(namenew[f], "wb")) == NULL)
printf("Error: can't open out file\n");
for (times = 0; times <= size * 1024 && (!feof(in)); times++) {
ch = fgetc(in);
flag = (!feof(in));
if (flag == 1)
fputc(ch, out);
}
per = (f + 1) / (float) (1 + len / size) * 100;
printf(" %d%% has been done.\n", per);
f = changename(f);
fclose(out);
}
fclose(in);
savename(nameinputt, f);
savesize(nameinputt, size);
printf(" Done!\n");
printf("-------------------------------------------------------------------------------\n");
return 0;
}
int merge(char *directory)
{ /* The function to merge */
int i = 0;
int count = 0, times, per;
long int size = 0;
int ch, flag;
FILE *creat, *file;
char full_file_name[255];
printf(" Merging...please wait.\n");
printf("-------------------------------------------------------------------------------\n");
printf(" 0%% has been done.\n");
count = readname(directory);
size = readsize(directory);
strcpy(full_file_name, directory);
strcat(full_file_name, "\\");
strcat(full_file_name, namedest[count]);
if ((creat = fopen(full_file_name, "wb")) == NULL)
printf("Error: can't create file\n");
fclose(creat);
if ((creat = fopen(full_file_name, "ab")) == NULL)
printf("Error: can't open created file\n");
do {
strcpy(full_file_name, directory);
strcat(full_file_name, "\\");
strcat(full_file_name, namedest[i]);
if ((file = fopen(full_file_name, "rb")) == NULL) {
printf("Error: can't open splited file\n");
exit(0);
}
for (times = 0; times <= size * 1024 && (!feof(file)); times++) {
ch = fgetc(file);
flag = (!feof(file));
if (flag == 1)
fputc(ch, creat);
}
per = (i + 1) / (float) count *100;
printf(" %d%% has been done.\n", per);
fclose(file);
i++;
} while (i < count);
fclose(creat);
printf(" Done! The file is:\n");
printf(namedest[count]);
printf("\n");
return 0;
}
int main(int argc, char *argv[])
{ /* Human interface */
int i;
long int size = 0;
if ((argc == 1) || (argc == 2) || (argv[1] == "--help")
|| (argv[1] == "/?") || ((argc == 3) && (argv[1][0] != 'u'))
|| ((argc == 4) && (argv[1][0] != 's')) || (argc > 4) ) {
printf("spliter, a program to split and merge files.\nDesigned by linuxqc@gmail.com.\nThis is version 1.1.3.\n\n");
printf("Usage:\n");
printf("To split: spliter s < filename > < size of each part measured by Kilo Bytes >\n");
printf("To merge: spliter u < directory, in which the splited files are stored. >\n\n");
printf("Example: spliter s file 3\nSplit file to many parts, each of them is 3 KB's big.\n\n");
printf("Attention: When you merge the many files that you have splited to, please make sure that they are in the same directory with 'data_file_names' and 'data_file_size'.\n\n");
exit(0);
}
else if ((argc == 3) && (argv[1][0] == 'u')) {
merge(argv[2]);
exit(0);
}
else {
for (i = 0; i < 256; i++) {
if (argv[2][i] != '\0')
nameinputt[i] = argv[2][i];
else
break;
}
size = atoi(argv[3]);
split(nameinputt, size);
exit(0);
}
return 0;
}
|