Codice PHP:
// cp.c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#define N 250
typedef unsigned char BYTE;
bool filecopia(char *filename, char *file2);
bool canopen(char * filename, char *mode);
int main(int argc, char *argv[]) {
if(argc != 3 || (argc >= 2 && strcmp(argv[1], "--help") == 0) || (argc >= 2 && strcmp(argv[1], "--h") == 0) || (argc >= 3 && strcmp(argv[2], "--help") == 0) || (argc >= 3 && strcmp(argv[2], "--h") == 0)) {
printf("Usage: \"%s source destination\".\n", argv[0]);
return 0;
}
if(!canopen(argv[1], "rb")) {
fprintf(stderr, "Cannot open file 1.\n");
exit(EXIT_FAILURE);
}
else if(!canopen(argv[2], "wb")) {
fprintf(stderr, "Cannot open file 2.\n");
exit(EXIT_FAILURE);
}
else {
printf("Starting...\n");
if(filecopia(argv[1], argv[2])) {
printf("Success!\n");
return 0;
}
}
fprintf(stderr, "Error during file coping.\nClosing...\n");
exit(EXIT_FAILURE);
}
bool canopen(char * filename, char *mode) {
FILE *fp;
fp = fopen(filename, mode);
if(fp== NULL) {
printf("Cannot open: %s: \"%s\"\n", filename, mode);
return false;
}
fclose(fp);
printf("Canopen: %s: \"%s\"\n", filename, mode);
return true;
}
bool filecopia(char *filename, char *file2) {
printf("%s->%s\n", filename, file2);
FILE *f1 , *f2;
char buf1[N], buf2[N];
BYTE p;
int pos, i = 0;
if(canopen(file2, "rb")) {
remove(file2);
}
f1 = fopen(filename, "rb");
f2 = fopen(file2, "rb");
if (f1==NULL || f2==NULL) {
fprintf(stderr, "Error opening files.\n");
fclose(f1);
fclose(f2);
return false;
}
setvbuf(f1, buf1, _IOFBF, N);
setvbuf(f2, buf2, _IOFBF, N);
fseek(f1, 0L, SEEK_END);
pos = ftell(f1);
printf("Pos: %d\n", pos);
rewind(f1);
for(i = ftell(f1);i<pos;i = ftell(f1)) {
printf("Posf1: %d\tPosf2: %d\t", i, ftell(f2));
fread(&p, 1, 1, f1);
fwrite(&p, 1, 1, f2);
printf("Pos2f1: %d\tPos2f2: %d \n", ftell(f1), ftell(f2));
}
fclose(f1);
fclose(f2);
if (!canopen(file2, "rb")) {
fprintf(stderr, "Error on written file.\n");
return false;
}
return true;
}