Datei durch buffer in bytes umwandeln, ohne ende .. ?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von K_K.

    Datei durch buffer in bytes umwandeln, ohne ende .. ?

    Hallo

    Der Titel sagt jetzt nicht all zu viel, aber ich versuch das Problem jetzt mal zu beschrieben

    Es geht um folgenden Code:

    VB.NET-Quellcode

    1. Using FS As New IO.FileStream(zusendendesobjeckt, FileMode.Open, FileAccess.Read) 'öffnen der Datei
    2. Dim buffer(1024) As Byte
    3. While FS.Read(buffer, 0, buffer.Length) >= 0 'liest Blockweiße solange ein, bis keine 1024 Bytes mehr vorhanden sind
    4. streamw.Write(buffer)
    5. End While
    6. End Using 'hier wird die Datei geschlossen
    7. streamw.Flush()


    dieser zerlegt eine Datei und sendet sie über den streamwriter los.
    so sollte es zumindest sein.

    Das Problem:

    Mein Programm sendet immer weiter und hört auch nicht auf, wenn die Datei angekommen ist. Wenn ich an meinem TCP Server gucke, was dort ankommt, steht dort folgendes:

    Quellcode

    1. 91
    2. 91
    3. 93
    4. 93
    5. 83
    6. 83
    7. 121
    8. 121
    9. 115
    10. 115
    11. 116
    12. 116
    13. 101
    14. 101
    15. 109
    16. 109
    17. 46
    18. 46
    19. 66
    20. 66
    21. 121
    22. 121
    23. 116
    24. 116
    25. 101
    26. 101
    27. 91
    28. 91

    danach fängt es wieder von vorne an.
    Mit den zahlen hab ich kein Problem, aber das es immer wieder von fone anfängt.. das find ich komisch ^^
    woran liegt das?
    = 0 heißt, nichts gelesen, also wenn er nichts liest, hängt er den gesamten Buffer wieder ran.

    VB.NET-Quellcode

    1. While FS.Read(buffer, 0, buffer.Length) > 0 'liest Blockweiße solange ein, bis keine 1024 Bytes mehr vorhanden sind
    Besser:

    VB.NET-Quellcode

    1. Using FS As New IO.FileStream(zusendendesobjeckt, FileMode.Open, FileAccess.Read) 'öffnen der Datei
    2. Dim buffer(1023) As Byte ' 1024 Stück Bytes, da 0-basiert
    3. Dim bb As Integer ' die gelesene Anzahl sollte gleich der geschriebenen Anzahl sein
    4. Do
    5. bb = FS.Read(buffer, 0, buffer.Length) 'liest Blockweiße solange ein, bis keine 1024 Bytes mehr vorhanden sind
    6. If (bb = 0) Then
    7. Exit Do
    8. End If
    9. streamw.Write(buffer, 0, bb)
    10. Loop
    11. End Using 'hier wird die Datei geschlossen
    12. streamw.Flush()
    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!
    Sehr vielen großen danke
    jetzt hab ich noch ein Problem, mit dem zurückwandeln.

    also, so hab ich den zurück Wandel Code bisher ..:

    VB.NET-Quellcode

    1. Using fs As New IO.FileStream(My.Computer.FileSystem.SpecialDirectories.Temp + "\data.mp3", FileMode.OpenOrCreate, FileAccess.Write) 'öffnen der Datei
    2. Dim buffer(1023) As Byte
    3. Dim zulesendebytes As Integer = buffer.Length
    4. While (zulesendebytes > 0) 'liest Blockweiße solange ein, bis keine 1024 Bytes mehr vorhanden sind
    5. Dim zulesendebytes1 As Integer
    6. zulesendebytes1 = stream.Read(buffer, 0, Math.Min(zulesendebytes, buffer.Length))
    7. fs.Write(buffer, 0, bytesToRead)
    8. zulesendebytes = zulesendebytes1
    9. End While
    10. End Using


    Nur dieser Code speichert mir in meiner Datei jetzt leider die Bytes als zahlen in der neuen Datei...
    Könnte mir eventuell jemand sagen, was ich falsch mache?
    Dann hast Do wohl streamw falsch deklariert:

    VB.NET-Quellcode

    1. Using streamw As New IO.FileStream(DEIN_PFAD, FileMode.Open, FileAccess.Write)
    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!
    ich weiß nicht gemau, wie du dass jetzt meinst...

    was ist denn der Unterschied zwischen:

    VB.NET-Quellcode

    1. 'deine version
    2. Using streamw As New IO.FileStream(DEIN_PFAD, FileMode.Open, FileAccess.Write)

    und

    VB.NET-Quellcode

    1. Using fs As New IO.FileStream(Dein_Pfad, FileMode.OpenOrCreate, FileAccess.Write)

    es ist doch beides das gleiche ?

    in die Datei kann ich ja schreiben, nur er schreibt mir die beits hald blödewereise als strings darein .. also quasi:
    so sieht hinterher eine erstellte datei aus ..

    Quellcode

    1. 42
    2. 91
    3. 123
    4. 31
    5. 53
    6. 35
    7. 98
    8. 34
    9. ...
    Nochmal zum Verständnis:
    In Deinem 1. Post ist FS der Stream zum Lesen der Datei und streamw der Stream zum Schreiben der anderen Datei.
    In Deinem letzten Post ist fs der Stream zum Schreiben der anderen Datei.
    Bitte drück Dich mal ganz klar aus und poste den gesamten Code.
    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!
    Also:
    Mit dem streamw sende ich die Bytes an meinen tcp server...
    Mit dem streamr empfange ich die Bytes wieder ^^
    Wenn ich die Bytes empfange, müssen sie wieder zu einer Datei zusammengesetzt werden, nur gerade das funktioniert nicht...
    Er schreibt die Bytes als Strings in die Datei..
    Kann es sein, dass Du nicht Option strict On hast?
    Ich denke mal, dass da irgendwo implizit ein ToString gemacht wird.
    Also Option strict On und wir sehen weiter.
    Poste doch ggf. mal etrwas mehr Code.
    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!
    habe jetzt beim Server und beim Clienten Option strict On..
    2 Probleme, die ich nicht lösen kann, ich arbeite nicht sehr oft mit Option strict On..1: Geht das ? :

    VB.NET-Quellcode

    1. Dim tmp As Byte = CByte(con.streamr.Read)


    2: Den folgenden fehler bekomme ich nicht seber ausgebügelt :

    Quellcode

    1. Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "New" mit diesen Argumenten aufgerufen werden kann:
    2. 'Public Sub New(start As System.Threading.ParameterizedThreadStart)': "Option Strict On" erlaubt keine Einschränkungen in impliziten Typkonvertierungen zwischen der Private Sub ListenToConnection(con As Connection)-Methode und dem Delegaten "Delegate Sub ParameterizedThreadStart(obj As Object)".
    3. 'Public Sub New(start As System.Threading.ThreadStart)': Die Signatur der Private Sub ListenToConnection(con As Connection)-Methode ist mit dem Delegaten "Delegate Sub ThreadStart()" nicht kompatibel. ***bla***

    bei folgendem (ich hab es mal zusammen geschrieben) :

    VB.NET-Quellcode

    1. While True
    2. Dim t As New Threading.Thread(AddressOf ListenandwriteToConnection)
    3. t.Start(c)
    4. End While

    t
    ist blau unterkringelt...

    3: ach ja ... hier noch, wie ich es empfange und weiterleite :

    VB.NET-Quellcode

    1. Private Sub ListenandwriteToConnection(ByVal con As Connection)
    2. Do
    3. Try
    4. Dim tmp As Byte = CByte(con.streamr.Read)
    5. SendToAllClients(tmp)
    6. Catch
    7. list.Remove(con)
    8. Exit Do
    9. End Try
    10. Loop
    11. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „K_K“ ()