How to fix corrupted file from FTP transfer

This content 3 years old. Please, read this page keeping its age in mind along with the fact technology changes fast and the information on this page me be outdated, not best practice, or plain wrong.

Sometimes it happens.  I intend to send a binary file to an FTP server and forget to change the mode to BINARY before starting the transfer.

It’s really easy to do… and it was a natural habit type of thing back in the day when I used FTP frequently…


Simple and straight forward.  Anyway, I screwed up the other day and thought all was lost after a few .tgz files I transferred over to a server via FTP were not extractable.  I deleted my source before verifying my file transfers, stupid me.

Anyway, a tool that worked like a champ, Windows and Linux, is fixgz.  fixgz attempts to fix a binary file transferred in ascii mode by
* removing each extra CR when it followed by LF.  So if you ever get a corrupted file after transferring via FTP in the wrong format, give this a whirl.


/* fixgz attempts to fix a binary file transferred in ascii mode by
 * removing each extra CR when it followed by LF.
 * usage: fixgz  bad.gz fixed.gz
 * WARNING: the output file name must be different from the input file name!

 * Copyright 1998 Jean-loup Gailly <>
 *   This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the author be held liable for any damages
 * arising from the use of this software.

 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely.


int main(argc, argv)
     int argc;
     char **argv;
    int c1, c2; /* input bytes */
    FILE *in;   /* corrupted input file */
    FILE *out;  /* fixed output file */

    if (argc <= 2) {
	fprintf(stderr, "usage: fixgz bad.gz fixed.gz
    if (!strcmp(argv[1], argv[2])) {
	fprintf(stderr, "input and output files must be different
    in  = fopen(argv[1], "rb");
    if (in == NULL) {
	fprintf(stderr, "fixgz: cannot open %s
", argv[1]);
    out = fopen(argv[2], "wb");
    if (in == NULL) {
	fprintf(stderr, "fixgz: cannot create %s
", argv[2]);

    c1 = fgetc(in);

    while ((c2 = fgetc(in)) != EOF) {
	if (c1 != '
' || c2 != '
') {
	    fputc(c1, out);
	c1 = c2;
    if (c1 != EOF) {
	fputc(c1, out);
    return 0; /* avoid warning */

Speak Your Mind


This site uses Akismet to reduce spam. Learn how your comment data is processed.