Yahoo Clever wird am 4. Mai 2021 (Eastern Time, Zeitzone US-Ostküste) eingestellt. Ab dem 20. April 2021 (Eastern Time) ist die Website von Yahoo Clever nur noch im reinen Lesemodus verfügbar. Andere Yahoo Produkte oder Dienste oder Ihr Yahoo Account sind von diesen Änderungen nicht betroffen. Auf dieser Hilfeseite finden Sie weitere Informationen zur Einstellung von Yahoo Clever und dazu, wie Sie Ihre Daten herunterladen.

Wie kann man eine Datei stellenweise überschreiben?

Ich möchte eine Datei A in eine andere Datei B kopieren. Datei A soll Datei B nicht komplett ersetzen, sondern nur den Anfang überschreiben, während das Ende von Datei B erhalten bleibt (sofern Datei B größer ist als Datei A).

Angenommen Datei A ist 16 Bytes groß und Datei B 64 Bytes. Ich brauche jetzt ein Programm, das die ersten 16 Bytes von Datei B mit dem Inhalt aus Datei A überschreibt und die restlichen 48 Bytes aus Datei B unverändert läßt, so daß diese weiterhin 64 Bytes groß ist.

Wie bekommt man das hin? Am besten nicht nur am Anfang einer Datei, sondern das man eine Datei an einem beliebigen Offset in eine andere Datei schreiben kann. Natürlich für jede beliebige Größe (ggf. Mega- oder Gigabyte), so daß ein manuelles Bearbeiten mit einem Hex-Editor ausscheidet.

3 Antworten

Bewertung
  • vor 8 Jahren
    Beste Antwort

    Unter Linux geht das mit »dd«:

    $ dd if=Datei.1 of=Datei.2 conv=notrunc

    Hiermit wird »Datei.1« nach »Datei.2« kopiert, ohne das Ende einer bereits bestehenden »Datei.2« abzuschneiden (notrunc).

    Mit Angabe von »bs=«, »skip=«, »seek=« und »count=« kann man quasi von jeder beliebigen Position aus »if« (input file) lesen und die Daten an jede beliebige Position in »of« (output file) schreiben. Du darfst nur das »conv=notrunc« nie vergessen, wenn Du nicht willst, daß die Ausgabe-Datei auf die neue Größe (Position des letzten Schreibzugriffs durch dd) gekürzt wird.

    $ dd if=Datei.1 of=Datei.2 bs=1 skip=10 seek=50 count=20 conv=notrunc

    Hiermit werden z.B. 20 Bytes (count) ab Offset 10 (skip) aus »Datei.1« gelesen und ab Offset 50 (seek) in »Datei.2« geschrieben, ohne das Ende von »Datei.2« abzuschneiden (conv=notrunc) [sofern »Datei.2« schon vorher existierte und größer als 70 Bytes war]. Lies Dir am besten die man-page zu »dd« durch für nähere Einzelheiten.

    Ansonsten kann man auch leicht selbst ein Programm schreiben. In C kann man eine Datei zum Lesen und Schreiben öffnen ("r+"). Man kann dann einfach einzelne Bereiche überschreiben (mit fseek() positionieren und mit fwrite() schreiben). Die Daten in Bereichen, die nicht explizit überschrieben werden, bleiben erhalten und auch die ursprüngliche Dateigröße bleibt bestehen (außer man schreibt darüber hinaus und hängt am Ende weitere Daten an). Eine Funktion könnte (auf die Schnelle) etwa so aussehen:

    int schreibe(char *Dateiname, void *Puffer, int Position, int Laenge){

    FILE *Datei;

    if((Datei = fopen(Dateiname, "r+")) == NULL) return EXIT_FAILURE;

    if(fseek(Datei, Position, SEEK_SET)){

    fclose(Datei);

    return EXIT_FAILURE;

    }

    if(fwrite(Puffer, 1, Laenge, Datei) == Laenge){

    fclose(Datei);

    return EXIT_SUCCESS;

    }

    fclose(Datei);

    return EXIT_FAILURE;

    }

  • vor 8 Jahren

    Du wirst nicht umhin kommen, dafür selbst ein kleines Programm zu schreiben, z.B. mit Basic

  • vor 8 Jahren

    Erich Mielke wird's wissen.

Haben Sie noch Fragen? Jetzt beantworten lassen.