2009-01-08 7 views
1

Lors de l'affichage (ou l'édition) d'un fichier .gz, vim sait localiser gunzip et afficher le fichier correctement.
Dans ce cas, getfsize (expand ("%")) correspond à la taille du fichier compressé.Comment obtenir la taille d'un fichier gunzip dans vim

Existe-t-il un moyen d'obtenir la taille du fichier développé? Une autre façon de résoudre ce problème pourrait être d'obtenir la taille du tampon courant, mais il semble qu'il n'y ait pas de telle fonction dans vim. Est-ce que je manque quelque chose?

+0

Quel est le problème avec ma réponse ci-dessous? –

+0

J'en ai besoin pour écrire des scripts vim, pour comparer la taille du tampon. : les commandes n'aident pas là. –

+0

Aurait dû être mentionné dans la question? –

Répondre

0

Si vous êtes sous Unix/Linux, essayez

:%!wc -c 

C'est en octets. (Cela fonctionne sur Windows, si vous avez par exemple installé cygwin.) Puis appuyez sur u pour récupérer votre contenu.

HTH

+0

Quelqu'un devrait expliquer pourquoi il a été downvoted, comme cela fonctionne? –

1

Il n'y a pas moyen facile d'obtenir la taille d'un fichier non compressé gzip, peu de décompressant et en utilisant la fonction getfsize(). Ce n'est peut-être pas ce que tu veux. J'ai pris un coup d'oeil à RFC 1952 - GZIP File Format Specification, et la seule chose qui pourrait être utile est le champ ISIZE, qui contient "... la taille de l'original (non compressé) des données d'entrée modulo 2^32".

EDIT:

Je ne sais pas si cela aide, mais voici une preuve de concept code C j'ai jeté ensemble qui récupère la valeur du champ iSize dans un fichier gzip. Cela fonctionne pour moi en utilisant Linux et gcc, mais votre kilométrage peut varier. Si vous compilez le code, puis passez un nom de fichier gzip en tant que paramètre, il vous indiquera la taille non compressée du fichier d'origine.

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    FILE *fp = NULL; 
    int i=0; 

    if (argc != 2) { 
     fprintf(stderr, "Must specify file to process.\n"); 
     return -1; 
    } 

    // Open the file for reading 
    if ((fp = fopen(argv[1], "r")) == NULL) { 
     fprintf(stderr, "Unable to open %s for reading: %s\n", argv[1], strerror(errno)); 
     return -1; 
    } 

    // Look at the first two bytes and make sure it's a gzip file 
    int c1 = fgetc(fp); 
    int c2 = fgetc(fp); 
    if (c1 != 0x1f || c2 != 0x8b) { 
     fprintf(stderr, "File is not a gzipped file.\n"); 
     return -1; 
    } 


    // Seek to four bytes from the end of the file 
    fseek(fp, -4L, SEEK_END); 

    // Array containing the last four bytes 
    unsigned char read[4]; 

    for (i=0; i<4; ++i) { 
     int charRead = 0; 
     if ((charRead = fgetc(fp)) == EOF) { 
      // This shouldn't happen 
      fprintf(stderr, "Read end-of-file"); 
      exit(1); 
     } 
     else 
      read[i] = (unsigned char)charRead; 
    } 

    // Copy the last four bytes into an int. This could also be done 
    // using a union. 
    int intval = 0; 
    memcpy(&intval, &read, 4); 

    printf("The uncompressed filesize was %d bytes (0x%02x hex)\n", intval, intval); 

    fclose(fp); 

    return 0; 
} 
1

Cela semble fonctionner pour obtenir le nombre d'octets d'un tampon

(line2byte(line("$")+1)-1)

0

De l'intérieur éditeur vim, essayez ceci:

<Esc>:!wc -c my_zip_file.gz 

Cela vous affichera le nombre de octets que le fichier a.

Questions connexes