• # Re: Au secours !!! Perte de données !

    Posté par . En réponse au journal Au secours !!! Perte de données !. Évalué à 5.

    si tu as des données importantes, je peux peut etre t'aider(en effet un de mes ami qui avait perdu ses .avi sur une partoche a fait un petit programme pas con du tout et me l'a envoyé cet aprem):

    il te faut connaître (approximativement au moins) la taille de tes fichiers à récupérer, ainsi que les headers de ces fichiers.

    ensuite, tu vas légèrement modifier le programme suivant:



    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>

    #define FILE_SIZE (800*1024*1024)
    #define PATTERN "RIFF....AVI "
    #define BLOCK 4096

    int main( int argc, char **argv )
    {
    long offset;
    off_t off;
    int in, out;
    char *buffer;
    long i, len, pos;
    char pattern[] = PATTERN;
    long pattern_len = strlen(PATTERN);
    int count;


    in = open64( argv[1], O_LARGEFILE|O_RDONLY );
    if( in == -1 )
    {
    perror( "in:" );
    exit(1);
    }

    if( argc == 4 )
    offset = atoi( argv[3] );
    else
    offset = 0;

    buffer = malloc( BLOCK );
    count = 0;
    while( read( in, buffer, BLOCK ) == BLOCK )
    {
    for( i = 0 ; i < pattern_len ; i++ )
    if( (pattern[i] != '.') && (buffer[i] != pattern[i]) )
    break;
    if( i == pattern_len )
    {
    // OK on copie le fichier :p
    char filename[256];
    long size = *(long*)(buffer+4);

    count++;

    off = lseek64( in, 0, SEEK_CUR );

    sprintf( filename, "%s/%d", argv[2], count );
    printf( "%s (%d Mo) ", filename, size/1024/1024 );
    fflush(stdout);

    if( count < offset )
    {
    printf( "skipped\n" );
    } else {

    out = open( filename, O_WRONLY|O_CREAT );
    if( in < 0 )
    {
    perror( "open:" );
    exit( 1 );
    }
    i = 0;
    do
    {
    if( write( out, buffer, BLOCK ) != BLOCK )
    {
    perror( "write:" );
    exit(1);
    }
    if( read( in, buffer, BLOCK ) != BLOCK )
    break;
    i += BLOCK;
    if( (i % (100*1024*1024)) == 0 )
    {
    printf( "#" );
    fflush(stdout);
    }
    } while( i < size );
    close(out);
    printf( " done\n" );
    if( ((off=lseek64( in, off, SEEK_SET )) < 0) && (off != -EOVERFLOW) )
    {
    perror( "lseek:" );
    exit(1);
    }
    }
    }
    }
    close(in);
    printf( "END OF FILE\n" );



    les modifs à faire, sont:

    - editer le #define PATTERN correspondant au header du fichier et mettre des '.' à la place des caractères variables d'un header à l'autre.

    - modifier la ligne "long size = *(long*)(buffer+4);" pour mettre dans size la taille de ton fichier (mieu vaut surevaluer, apres tu pourras toujours couper dedans avec head par exemple) en octet.

    puis il te faut:

    - compiler ca avec:
    "gcc aa.c -o aa -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"

    - prier pour que ton fichier ne soit pas fragmenté

    pour les arguments:
    "./aa /dev/partoche /rep/de/sauvegarde [nombre de fichiers à sauter (en cas d'interruption)]"