Dateien zusammenfügen

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Nikx.

    Dateien zusammenfügen

    Hey :)

    Mich würde interessieren wie ich mehrere Dateien oder Daten in einer Datei speichern
    und wieder abrufen kann. Das ganze wird vermutlich mit Byte-Arrays funktionieren, damit
    habe ich mich aber bislang nicht befasst. Ein Byte-Array aus einer Datei zu erstellen ist ja auch kein
    Problem, aber wie kann ich dann mehrere Dateien zusammenführen und wieder passend trennen?

    Bestenfalls auch Daten, sodass ich erst einen String und dann eine Datei habe.
    Spoiler anzeigen
    Ich habe auch darüber nachgedacht meine Informationen in einer .xml zu speichern,
    das hielt ich aber für unsinnig, ich möchte keine mehrere MB große Datei einfach in ne
    XML schreiben. Wäre ja auch blöd, dann könnte ja im Prinzip jeder Nutzer einfach die Datei
    wieder zusammensetzen.

    Wie also vorgehen?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Hi
    einfachstes Prinzip:
    - schreibe die Blocklänge (als Long) in die Datei
    - schreibe den Block in die Datei
    Wenn du weitere Informationen mit abspeichern willst, musst du halt immer sicherstellen, dass die Länge von Blöcken mit dynamischer Länge, wie halt bei Byte-Arrays, Strings, usw. irgendwo herausgefunden werden kann - z.B. durch Blöcke mit konstanter Länge. Stelle außerdem sicher, dass die abgespeicherten Daten kulturunabhängig sind, also solltest du z.B. Unicode als String-Encoding verwenden. Hilfreiche Klassen sind z.B. System.Text.Encoding.GetBytes/GetString/GetChars, BitConverter.GetBytes/To*. Es macht übrigens auch Sinn, eine Pufferung einzubauen, also nicht einen 5 GB großen Block auszulesen, nur weil er 5 GB groß ist, obwohl du es gar nicht bräuchtest.
    Für Binärdaten ist Xml unpraktisch.

    Gruß
    ~blaze~
    Hi,

    danke erstmal :)
    Es ist kein Problem die Länge in die Datei zu schreiben,
    und danach die Bytes. Aber wie will ich dann die Dateien wieder trennen,
    bzw. woher weiß ich dann wo die Länge oder co. endet?
    An sich durchschaue ich das noch nicht ganz, wie gesagt, ich beschäftige mich
    zu selten mit sowas. Ich soll also erst die Länge eines eingelesenen Bytearrays schreiben,
    und dann mit WriteAllBytes die Datei hinten dran?

    Wäre nett wenn mir da nochmal jemand bisschen was erklären könnte ^^

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Da gibt es doch eigentlich nichts falsch zu machen.
    Einzige Vereinbarung: Länge in Bytes ist ein Long.
    Diesem folgen Länge Stück Bytes.
    Diesem folgt ein Long Länge2.
    Diesem folgen Länge2 Stück Bytes.
    Diesem folgt ein Long Länge3.
    usw. oder eben nix mehr.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja, aber wie kann ich das dann wieder auseinandernehmen?
    Ich kann ja schlecht wissen, wie lange die erste Längenangabe ist.
    Vermutlich hab ich nur irgendeinen Denkfehler oder keine Ahnung. Ich tippe
    auf letzteres.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Nikx schrieb:

    Ich kann ja schlecht wissen, wie lange die erste Längenangabe ist.

    RodFromGermany schrieb:

    Da gibt es doch eigentlich nichts falsch zu machen.
    Einzige Vereinbarung: Länge in Bytes ist ein Long.
    Ein Long ist 8 Byte lang.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Und wie kann ich nur die ersten 8 Bytes lesen?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Da .ReadAllBytes ein ByteArray zurückgibt vrmtl. den Index 0-7 des Bytearrays zusammensetzen?

    Ich habe damit wirklich keine Erfahrung, geschweige denn
    irgendwelche Ahnung.
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Gibt es nicht iwelche Streams, wo man gezielt auf Positionen und Größen zugreifen kann?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Spontan komme ich da auf BinaryReader und BinaryWriter.
    Davon hab ich aber noch weniger Ahnung.
    Ich wüsste nicht wie ich damit überhaupt arbeiten soll.
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Und was macht man da?
    Das Forum fragen? Oder alternativ mal die MSDN lesen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die herrliche Ironie, auf die Idee bin ich auch schon gekommen. @RodFromGermany:
    Was mir ins Auge gesprungen ist ist ReadInt64, was auch soweit funktioniert.
    Bei meiner Test-Datei erhalte ich dann die Length die ich auch als Long hineingeschrieben
    habe zurück.

    Fragt sich nur noch wie ich dann die Datei auslese, dazu hab ich noch nichts gefunden.
    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Nikx schrieb:

    dazu hab ich noch nichts gefunden.
    Mal so als Anhaltspunkt:

    VB.NET-Quellcode

    1. ReadInt64
    2. ReadInt64
    3. ReadInt64
    4. ReadInt64
    5. ReadInt64
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was mir ins Auge gesprungen ist ist ReadInt64, was auch soweit funktioniert.

    Fragt sich nur noch wie ich dann die Datei auslese, dazu hab ich noch nichts gefunden.

    Hier ist gemeint, wie ich mit der mit ReadInt64 ausgelesenen Längenangabe die Datei auslesen kann, ala x Bytes lesen.

    Offensichtlich reden wir aneinander vorbei.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Es kommt einfach darauf an, was du damit machen willst. Folgender Code kopiert z.B. einen kompletten Reststream an das Ende eines Ziel-Streams.

    VB.NET-Quellcode

    1. Public Shared Sub CopyStream(ByVal destination As IO.Stream, ByVal source As IO.Stream)
    2. Dim buffer(4095) As Byte
    3. Dim len As Integer
    4. Do
    5. len = source.Read(buffer, 0, buffer.Length)
    6. destination.Write(buffer, 0, len)
    7. Loop While len > 0
    8. End Sub


    Gruß
    ~blaze~
    Ich möchte mehrere Dateien zu einer Datei zusammensetzten und die einzelnen Dateien später wieder
    aus der Datei herausholen.

    Unglaublich, aber ich habs hinbekommen:

    VB.NET-Quellcode

    1. Dim BinReader As New IO.BinaryWriter(IO.File.Open("MyCombined.File", IO.FileMode.Create))
    2. Dim len As Long = IO.File.ReadAllBytes("My.File").Length
    3. BinReader.Write(len)
    4. BinReader.Write(IO.File.ReadAllBytes("My.File"))
    5. BinReader.Dispose()


    So schreibe ich in die Datei. Das verstehe ich noch.

    VB.NET-Quellcode

    1. Dim BinReader As New IO.BinaryReader(File.Open("MyCombined.File", FileMode.Open))
    2. Dim len As String = BinReader.ReadInt64
    3. Dim buffer() As Byte = BinReader.ReadBytes(len)
    4. Dim BinWriter As New IO.BinaryWriter(File.Open("NewMy.File", FileMode.Create))
    5. BinWriter.Write(buffer, 0, len)
    6. BinReader.Dispose()
    7. BinWriter.Dispose()


    Ich versuche mich mal dran das ganze mit mehreren Dateien umzusetzen, mal sehn obs klappt.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

    Nikx schrieb:

    Offensichtlich reden wir aneinander vorbei.
    Ganz bestimmt nicht.
    Allerdings glaube ich, dass Du nicht in der Lage bist, mal ein klein wenig quer zu grasen, da hättest Du auf der von mit geposteten Seite alles gefunden, was Du brauchst.
    Wenn Du allerdings alles vorgekaut haben musst, hast Du im Hauptforum nix zu suchen, da werden halt ein paar andere Voraussetzungen erwartet.
    Und das war keine Ironie, das war Hilfe zur Selbsthilfe. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!