Fragmenteur de fichiers en c

Contenu du snippet

Toujours dans la série "J'apprend le C", voici un autre programme bidon...

Il fragmente donc un fichier donné par la ligne de commande en fichiers dont la taille est elle aussi passée par la ligne de commande, par exemple pour fragmenter TOTO.TXT en fichiers de 3 octets : split toto.txt 3

J'avais programmé la même chose en Pascal (Turbo Pascal 7) du temps où je téléchargeais les patchs de Baldur's Gate au lycée pour les ramener chez moi, sur des disquettes... (ok c'est chiant mais le jeu en valait la chandelle)

Source / Exemple :


#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define MAX_BUFFER 0x100000

int main(int argc, char* argv[]) {
  int i = 0;
  int j = 0;
  int n = 0;
  int x = 0;
  char file[13];
  char* buf = NULL;
  FILE* dest = NULL;
  FILE* source = NULL;
  if (argc < 2 || argc > 3) {
    printf("Usage: SPLIT <FILENAME> [BYTES]\n");
    return EXIT_FAILURE;
  } else if (argc == 3) n = abs(atoi(argv[2]));
  if (!n || n > MAX_BUFFER) n = MAX_BUFFER;
  if (!(buf = (char*) malloc(n))) {
    printf("Error creating read buffer of %i bytes.\n", n);
    return EXIT_FAILURE;
  }
  if (!(source = fopen(argv[1], "rb"))) {
    printf("Error opening file <%s> for reading.\n", argv[1]);
    free(buf);
    return EXIT_FAILURE;
  }
  printf("Splitting file <%s> with %i bytes fragments... ", argv[1], n);
  for (i = 0; i < 99999999; i++) {
    sprintf(file, "%08d.FRG", i);
    if ((x = fread(buf, 1, n, source)) > 0) {
      if (!(dest = fopen(file, "wb"))) {
        printf("failure (cannot create file <%s>)\n", file);
        free(buf);
        fclose(source);
        return EXIT_FAILURE;
      }
      j++;
      fwrite(buf, 1, x, dest);
      fclose(dest);
    } else break;
  }
  if (feof(source)) {
    printf("done (%i files)\n", j);
    printf("To restore your original file, type [COPY *.FRG /B \"%s\"] in console.\n", argv[1]);
  } else printf("failure (too many files)\n");
  free(buf);
  fclose(source);
  return EXIT_SUCCESS;
}

Conclusion :


Bon c'est mon deuxième programme fonctionnel de la journée, mais je suis toujours ouvert à toutes critiques/remarques si je fais mal un truc, n'hésitez pas à me le dire ;)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.