Dateien splitten

  • Hi Community,

    ich hab mich im Dateien splitten versucht und jedoch gescheitert. Die "Part_2" Datei ist bei mir immer doppelt so groß, wie die ursprüngliche Datei und die "wiederzusammengefügte" Datei ist ebenfalls doppelt so groß wie die Ausgangsdatei.

    Mein Code bisher:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;|> Edit to test! <|
    ;> Dateiendung der fertigen Datei
    $sOutputFileExtension = "mp4"
    ;> Datei die gesplittet werden soll
    $sFilePathToLoad = "C:\Users\xxxxx\Videos\Apologize.mp4"
    ;|||||||||||||||||||

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $sFilePath = @ScriptDir & "\Part_"
    $sFileExtension = "." & $sOutputFileExtension & ".sf"

    [/autoit] [autoit][/autoit] [autoit]

    $iTrim = 200000

    [/autoit] [autoit][/autoit] [autoit]

    ;--------------
    ; Datei, die gesplittet werden soll, einlesen -> Modus 16: Erzwinge binäres (byte) Auslesen und Schreiben für FileRead und FileWrite

    [/autoit] [autoit][/autoit] [autoit]

    $hFileOpen = FileOpen($sFilePathToLoad, 16)

    [/autoit] [autoit][/autoit] [autoit]

    $sBinaeryFileData = FileRead($hFileOpen)
    FileClose($hFileOpen)
    ;$sBinaeryFileData enthält nun den Binärycode

    [/autoit] [autoit][/autoit] [autoit]

    $iFileLenght = StringLen($sBinaeryFileData)
    ;-----------------
    ; 2 Dateien erstellen, mit jeweils nur Teilen aus dem Binärycode

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 1: enthält nur $Trim (200000) Zeichen
    _FileCreate($sFilePath & "1" & $sFileExtension)
    $hFile1 = FileOpen($sFilePath & "1" & $sFileExtension, 2)
    FileWrite($hFile1, StringLeft($sBinaeryFileData,$iTrim))
    FileClose($hFile1)

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 2: enthält nur $iFileLenght - $Trim Zeichen
    _FileCreate($sFilePath & "2" & $sFileExtension)
    $hFile2 = FileOpen($sFilePath & "2" & $sFileExtension, 2)
    FileWrite($hFile2,StringRight($sBinaeryFileData,$iFileLenght-$iTrim))
    FileClose($hFile2)

    [/autoit] [autoit][/autoit] [autoit]

    ;-----------------
    ; Datei erstellen, inder die beiden eben erstellten Dateien, wieder vereint werden sollen
    $sNewFileName = @ScriptDir & "\Video_Completed." & $sOutputFileExtension
    _FileCreate($sNewFileName)

    [/autoit] [autoit][/autoit] [autoit]

    ;-----------------
    ; Dateien auslesen

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 1 einlesen
    $hFile1 = FileOpen($sFilePath & "1" & $sFileExtension, 0)
    $hDataFile1 = FileRead($hFile1)

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 2 einlesen
    $hFile2 = FileOpen($sFilePath & "2" & $sFileExtension, 0)
    $hDataFile2 = FileRead($hFile2)

    [/autoit] [autoit][/autoit] [autoit]

    ;-> Datei, inder die Codes vereint werden sollen, öffnen und beiden Codeteile einfügen
    $hNewFile = FileOpen($sNewFileName,2)
    FileWrite($hNewFile,$hDataFile1 & $hDataFile2)

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($hNewFile)

    [/autoit] [autoit][/autoit] [autoit]

    ;- Dateigrößen anzeigen
    ToolTip("Information:" & @CRLF & "File 1: " & FileGetSize($sFilePath & "1" & $sFileExtension) & @CRLF & "File 2: " & FileGetSize($sFilePath & "2" & $sFileExtension) & @CRLF & @CRLF & "Completed File: " & FileGetSize($sNewFileName))

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(4000)
    Exit

    [/autoit]
  • Wie groß ist bei dir Part1?
    Ich hab es bei einer 45,6 MB großen Datei probiert und mein Part1 war 195kb groß und der Part 2 91,2MB sowie die Video_Completed.mp4

    Aus der Hilfe

    Zitat

    Binary mode is only required if you want to read or write a byte-order mark. By default AutoIt handles BOMs automatically. This flag has nothing to do with reading or writing binary data.

  • Also Part1 war auch 195kb und die anderen beiden immer doppelt so groß wie die Ausgangsdatei.

    Hmm, wenn ich nicht binary einlesen, dann klappt überhaupt nichts bei mir.

  • Der erste Part ist 200000 bytes groß weil du nur 200000 einlesen lässt für Part1^^
    Der Part 2 wird immer doppelt so groß, keine Ahnung wieso.

  • Hat jemand schon neue Erkenntnisse wo das Problem liegen könnte?
    @Jautois kannst du die neu erstelle .mp4 abspielen? Ich kann es nämlich nicht.

  • Nein die erstellte *.mp4 Datei kann ich nicht abspielen. Desweiteren weiß ich immer noch nicht, wo der Fehler liegen könnte.

    • Offizieller Beitrag

    Hallo,

    vllt. hilft ja der Beitrag [ gelöst ] schneiden

    So sollte es auch mit FileRead und FileWrite gehen

    Spoiler anzeigen
    [autoit]

    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;|> Edit to test! <|
    ;> Dateiendung der fertigen Datei
    $sOutputFileExtension = "mp4"
    ;> Datei die gesplittet werden soll
    $sFilePathToLoad = "C:\Users\xxxxx\Videos\Apologize.mp4"
    ;|||||||||||||||||||

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $sFilePath = @ScriptDir & "\Part_"
    $sFileExtension = "." & $sOutputFileExtension & ".sf"

    [/autoit] [autoit][/autoit] [autoit]

    $iTrim = 200000

    [/autoit] [autoit][/autoit] [autoit]

    ;--------------
    ; Datei, die gesplittet werden soll, einlesen -> Modus 16: Erzwinge binäres (byte) Auslesen und Schreiben für FileRead und FileWrite

    [/autoit] [autoit][/autoit] [autoit]

    $hFileOpen = FileOpen($sFilePathToLoad, 16)

    [/autoit] [autoit][/autoit] [autoit]

    $sBinaeryFileData1 = FileRead($hFileOpen, $iTrim)
    $sBinaeryFileData2 = FileRead($hFileOpen)
    FileClose($hFileOpen)
    ;$sBinaeryFileData enthält nun den Binärycode

    [/autoit] [autoit][/autoit] [autoit]

    $iFileLenght = StringLen($sBinaeryFileData1)
    ;-----------------
    ; 2 Dateien erstellen, mit jeweils nur Teilen aus dem Binärycode

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 1: enthält nur $Trim (200000) Zeichen
    ;~ _FileCreate($sFilePath & "1" & $sFileExtension)
    $hFile1 = FileOpen($sFilePath & "1" & $sFileExtension, 18)
    FileWrite($hFile1, $sBinaeryFileData1)
    FileClose($hFile1)

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 2: enthält nur $iFileLenght - $Trim Zeichen
    ;~ _FileCreate($sFilePath & "2" & $sFileExtension)
    $hFile2 = FileOpen($sFilePath & "2" & $sFileExtension, 18)
    FileWrite($hFile2, $sBinaeryFileData2)
    FileClose($hFile2)

    [/autoit] [autoit][/autoit] [autoit]

    ;-----------------
    ; Datei erstellen, inder die beiden eben erstellten Dateien, wieder vereint werden sollen
    $sNewFileName = @ScriptDir & "\Video_Completed." & $sOutputFileExtension
    ;~ _FileCreate($sNewFileName)

    [/autoit] [autoit][/autoit] [autoit]

    ;-----------------
    ; Dateien auslesen

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 1 einlesen
    $hFile1 = FileOpen($sFilePath & "1" & $sFileExtension, 16)
    $hDataFile1 = FileRead($hFile1)

    [/autoit] [autoit][/autoit] [autoit]

    ;-> File 2 einlesen
    $hFile2 = FileOpen($sFilePath & "2" & $sFileExtension, 16)
    $hDataFile2 = FileRead($hFile2)

    [/autoit] [autoit][/autoit] [autoit]

    ;-> Datei, inder die Codes vereint werden sollen, öffnen und beiden Codeteile einfügen
    $hNewFile = FileOpen($sNewFileName,18)
    FileWrite($hNewFile,$hDataFile1)
    FileWrite($hNewFile,$hDataFile2)

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($hNewFile)

    [/autoit] [autoit][/autoit] [autoit]

    ;- Dateigrößen anzeigen
    ToolTip("Information:" & @CRLF & "File 1: " & FileGetSize($sFilePath & "1" & $sFileExtension) & @CRLF & "File 2: " & FileGetSize($sFilePath & "2" & $sFileExtension) & @CRLF & @CRLF & "Completed File: " & FileGetSize($sNewFileName))

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(4000)
    Exit

    [/autoit]