Hilfe mit Split and Merge

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von afroamerekaner.

    Hilfe mit Split and Merge

    Hey habe volgendes Problem ich habe mir einen Code Ausm minternet geuscht der mir eine Datei zerlegen soll und anschliesend wieder zusammen bauen soll

    das ganze natürlich mit unterschiedlichen dateien und die beiden befehle getrent.

    das problem ist nur das der code bei split die datei zerlegt aber nciht einen einizgen byte in einer der teil dateien ablegt.

    könnt ihr mir da helfen?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class WAG_SplitAndMerge
    3. Public Shared Function SplitFile(ByVal SourceFile As String, ByVal nNoofFiles As Integer) As Boolean
    4. Dim Split As Boolean = False
    5. Try
    6. Dim fs As FileStream = New FileStream(SourceFile, FileMode.Open, FileAccess.Read)
    7. Dim SizeofEachFile As Integer = CType(Math.Ceiling((CType(fs.Length, Double) / nNoofFiles)), Integer)
    8. Dim i As Integer = 0
    9. Do While (i <= nNoofFiles)
    10. Dim baseFileName As String = Path.GetFileNameWithoutExtension(SourceFile)
    11. Dim Extension As String = Path.GetExtension(SourceFile)
    12. Dim outputFile As FileStream = New FileStream((Path.GetDirectoryName(SourceFile) + ("\" _
    13. + (baseFileName + ("." _
    14. + (i.ToString.PadLeft(5, Convert.ToChar("0")) _
    15. + (Extension + ".tmp")))))), FileMode.Create, FileAccess.Write)
    16. Dim bytesRead As Integer = 0
    17. Dim buffer() As Byte = New Byte((SizeofEachFile) - 1) {}
    18. If (fs.Read(buffer, 0, SizeofEachFile) > 0) Then
    19. outputFile.Write(buffer, 0, bytesRead)
    20. End If
    21. outputFile.Close()
    22. i = (i + 1)
    23. Loop
    24. fs.Close()
    25. Catch Ex As Exception
    26. MsgBox(Ex.Message)
    27. End Try
    28. Return Split
    29. End Function
    30. Public Shared Function MergeFile(ByVal InputFileFolder As String) As Boolean
    31. Dim Output As Boolean = False
    32. Try
    33. Dim tmpfiles() As String = Directory.GetFiles(InputFileFolder, "*.tmp")
    34. Dim outPutFile As FileStream = Nothing
    35. Dim PrevFileName As String = ""
    36. For Each tempFile As String In tmpfiles
    37. Dim fileName As String = Path.GetFileNameWithoutExtension(tempFile)
    38. Dim baseFileName As String = fileName.Substring(0, fileName.IndexOf(Convert.ToChar(".")))
    39. Dim extension As String = Path.GetExtension(fileName)
    40. If Not PrevFileName.Equals(baseFileName) Then
    41. If (Not (outPutFile) Is Nothing) Then
    42. outPutFile.Flush()
    43. outPutFile.Close()
    44. End If
    45. outPutFile = New FileStream((InputFileFolder + ("\" _
    46. + (baseFileName + extension))), FileMode.OpenOrCreate, FileAccess.Write)
    47. End If
    48. Dim bytesRead As Integer = 0
    49. Dim buffer() As Byte = New Byte((1024) - 1) {}
    50. Dim inputTempFile As FileStream = New FileStream(tempFile, FileMode.OpenOrCreate, FileAccess.Read)
    51. While (inputTempFile.Read(buffer, 0, 1024) > 0)
    52. outPutFile.Write(buffer, 0, bytesRead)
    53. End While
    54. inputTempFile.Close()
    55. File.Delete(tempFile)
    56. PrevFileName = baseFileName
    57. Next
    58. outPutFile.Close()
    59. Catch Ex As Exception
    60. End Try
    61. Return Output
    62. End Function
    63. End Class
    Sowas findet man im Internet? - wow!

    VB.NET-Quellcode

    1. Dim bytesRead As Integer = 0
    2. Dim buffer() As Byte = New Byte((SizeofEachFile) - 1) {}
    3. If (fs.Read(buffer, 0, SizeofEachFile) > 0) Then
    4. outputFile.Write(buffer, 0, bytesRead)
    5. End If
    von diesen 5 Zeilen hoffe ich, dass du nur 2 nicht richtig verstehst, nämlich #3 und #4

    Also, was meinst du, passiert hier:

    Visual Basic-Quellcode

    1. outputFile.Write(buffer, 0, bytesRead)
    Naja, im Grunde kannst du das nur verstehen, wenn du imstande bist, die Filestream.Write-Methode im ObjectBrowser aufzusuchen - dort ist sie nämlich dokumentiert.
    naja ich weis es erlich gesagt nicht aber ich gehe davon aus das dieser code die byte's in die Datei schreibt aber eben nur so lange wie die datei groß sein darf.

    nur begreife ich nicht warum das nicht functionirt kannst du mir sagen an welcher stelle der fehler ist?
    ja, was steht denn im ObjectBrowser unter "Zusammenfassung" dieser Methode?

    Du musst wissen, ich halte es für ganz unnütz, sogar schädlich, dir einfach die Lösung vorzusagen, weil davon lernst du nicht programmieren. Wenn du aber nur das Programm haben willst, ohne programmieren zu lernen - das geht nicht, denn ohne programmieren zu können, kannst du es nicht programmieren.

    Also es nützt nichts - du musst lernen, selbst die Dokumentation zu lesen, und deren Bedeutung zu verstehen.
    Andernfalls wirst du immer nur andere Leute für dich programmieren lassen - weil du selbst die Codesnippets nicht verstehst, die du bei dir einpastest.
    Ich denke ich weis wo der fehler liegt

    VB.NET-Quellcode

    1. fs.Read(buffer, 0, SizeofEachFile) > 0


    er geht bei dieser if abfrage immer auf false und somit wird diese übersprungen und meine packete bleiben lehr

    also muss ich mal schauen was es damit auf sich hat
    Zusammenfassung:
    Liest einen Byteblock aus dem Stream und schreibt die Daten in einen angegebenen Puffer.

    Parameter:
    array: Enthält nach dem Beenden dieser Methode das angegebene Bytearray mit den Werten zwischen offset und (offset + count - 1), die durch die aus der aktuellen Quelle gelesenen Bytes ersetzt wurden.
    offset: Das Byteoffset in array, an dem die gelesenen Bytes platziert werden.
    count: Die maximale Anzahl der zu lesenden Bytes.




    Ich bin schon in der lage das ganze zu nutzen jedoch hilft mir das im augenblick nciht wirklich weiter.

    Ich werde das jetzt bestimmt noch 10mal lesen und dann später mitbekommen das ich eigentlich nen fehler habe der ganz easy ist


    //Edit habe ihn jetzt gefunden Ernsthaft das war Dämlich

    VB.NET-Quellcode

    1. outputFile.Write(buffer, 0, buffer.Length - 1)


    wen count auf 0 steht ist klar das der nichts rein schreibt.

    afroamerekaner schrieb:

    das ich eigentlich nen fehler habe der ganz easy ist
    (da tu ich mal nicht widersprechen ;))

    jedenfalls, nochmal den Aufruf angeguckt:

    VB.NET-Quellcode

    1. outputFile.Write(buffer, 0, bytesRead)
    Und nu wissen wir: buffer ist der Puffer, der in den Filestream (also in die Datei) geschrieben wird.
    0 ist der Offset - also der Puffer wird von Anfang an weggeschrieben.
    bytesRead ist der Parameter count - die Anzahl an Bytes die geschrieben wird.

    Welchen Wert hat bytesRead?

    //edit: ah - du hast es schon :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Den Fehler haben wir - nun noch die Lösung (sehe grade, du versuchst bereits eine Lösung - die failt aber):
    Guck jetzt im ObjectBrowser die Doku der .Read - Methode: Zusammenfassung, Parameter + Rückgabewert.
    (Beachte: .Read ist eine Function, also mit Rückgabewert, während .Write eine Sub ist, ohne Rückgabewert)
    Die Gesamtanzahl der in den Puffer gelesenen Bytes. Dies kann weniger als die Anzahl der angeforderten Bytes sein, wenn diese Anzahl an Bytes derzeit nicht verfügbar ist, oder null, wenn das Streamende erreicht ist.



    es dürfte aber kein fehler mehr auf treten da ich ja wenn ich keine bytes mehr zum schreiben/lesen habe aufhöre und weniger können es auch nciht sein weil ich ja nur frage ob der rückgabe wert größer als 0 ist


    //Edit

    Jetzt habe ich Allerdings noch Hier einen fehler:


    VB.NET-Quellcode

    1. Public Shared Function MergeFile(ByVal InputFileFolder As String) As Boolean
    2. Dim Output As Boolean = False
    3. Try
    4. Dim tmpfiles() As String = Directory.GetFiles(InputFileFolder, "*.tmp")
    5. For i = 0 To tmpfiles.Length - 1
    6. MsgBox(tmpfiles(i))
    7. Next
    8. Dim outPutFile As FileStream = Nothing
    9. Dim PrevFileName As String = ""
    10. For Each tempFile As String In tmpfiles
    11. Dim fileName As String = Path.GetFileNameWithoutExtension(tempFile)
    12. Dim baseFileName As String = fileName.Substring(0, fileName.IndexOf(Convert.ToChar(".")))
    13. Dim extension As String = Path.GetExtension(fileName)
    14. If Not PrevFileName.Equals(baseFileName) Then
    15. If (Not (outPutFile) Is Nothing) Then
    16. outPutFile.Flush()
    17. outPutFile.Close()
    18. End If
    19. outPutFile = New FileStream((InputFileFolder + ("" _
    20. + (baseFileName + extension))), FileMode.OpenOrCreate, FileAccess.Write)
    21. End If
    22. Dim inputTempFile As FileStream = New FileStream(tempFile, FileMode.OpenOrCreate, FileAccess.Read)
    23. Dim buffer() As Byte = New Byte((inputTempFile.Length) - 1) {}
    24. While (inputTempFile.Read(buffer, 0, inputTempFile.Length) > 0)
    25. outPutFile.Write(buffer, 0, buffer.Length - 1)
    26. End While
    27. inputTempFile.Close()
    28. File.Delete(tempFile)
    29. PrevFileName = baseFileName
    30. Next
    31. outPutFile.Close()
    32. Catch Ex As Exception
    33. End Try
    34. Return Output
    35. End Function


    Ich habe Bereits das problem mit .read gelöst aber dennoch kann ich eine zerlegte exe nicht wieder so zusammen bauen das sie ausfürhbar ist.

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

    das wird gelöst indem ich angebe wieviele dateien ich haben will und der spaß errechnet dann wieviele dateien er erstellen muss die letze datei ist entweder genauso groß wie alle anderen oder kleiner aber niemals größer.

    //Edit Ich meinte wie Groß eine Datei Sein muss


    //Edit2 Jetzt Geht alles habe bei buffer.length das -1 Entfernt da ich dadurch immer ein byte gelöscht habe ;)

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