Frage

Ich habe zwei Basisdateien filea.txt Und fileb.txt.Ich versuche, eine Signatur zu erstellen, dann ein Delta mithilfe der Signatur und fileb.txt, dann patchen filea.txt mit diesem Delta.Der Inhalt der resultierenden Datei sollte derselbe sein wie fileb.txt

Im ersten Teil wird eine Signaturdatei erstellt filea.txt:

#include <stdlib.h>
#include <stdio.h>
#include "librsync.h"

int main(){
    FILE *fpa;
    fpa = fopen("filea.txt","r");

    FILE *fps;
    fps = fopen("sig.sig","w+");


    rs_result res = rs_sig_file(fpa, fps, 1,2,NULL);

    fclose(fpa);
    fclose(fps);

    printf("Result code: %d\n", res);

    return 0;
}

Dann soll der zweite diese Signatur verwenden fileb.txt Datei zum Erstellen einer Deltadatei

#include <stdlib.h>
#include <stdio.h>
#include "librsync.h"


int main(){
    FILE *fpb;
    fpb = fopen("fileb.txt", "r");

    FILE *fpd;
    fpd = fopen("delta.delt","w+");

    FILE *sigFile;
    sigFile = fopen("sig.sig","r");

    rs_signature_t *signature;

    rs_loadsig_file(sigFile, &signature, NULL);

    rs_result res = rs_delta_file(signature, fpb, fpd, NULL);

    printf("Result: %d", res);

    fclose(fpb); fclose(fpd); fclose(sigFile);

    return 0;
}

Ich kompile beide wie diesen GCC -o Delta create_delta.c -wall -g -lrsync

Aber der zweite Teil gibt einen Segmentierungsfehlerfehler aus.

Vielleicht erzeugt die dritte ausführbare Datei aus diesem Grund eine leere Datei:

int main() {
    FILE *fpd;
    fpd = fopen("delta.delt", "r");

    FILE *fpa;
    fpa = fopen("filea.txt", "r");

    FILE *fpn;
    fpn = fopen("file_new.txt", "w+");

    rs_patch_file(fpa, fpd, fpn, NULL);

    fclose(fpd); fclose(fpa); fclose(fpn);

    return 0;
}

AKTUALISIERENIch habe versucht, Dateizeiger auf Null zu überprüfen, nachdem fopen keine Fehler festgestellt hat.

War es hilfreich?

Lösung

Nach dem Anschauen https://rproxy.samba.org/doxygen/librsync/rsync_h.html Ich dachte, du musst es verwenden

rs_build_hash_table(signatur)

bevor Sie anrufen

rs_delta_file(signature, fpb, fpd, NULL);

Funktioniert dann gut für mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top