Seite 1 von 1

Wie Dateien richtig splitten (gelöst)

Verfasst: 12.08.2006 14:10
von PBZecke
Hallo!

Ich habe mit dem unteren code versucht Dateien zu splitten und wieder
zusammen zu setzen. Grundsätzlich funktioniert das auch mit Bildern, exe
usw. Nur Zip-Archive und manche Installer machen Probleme aller "Archiv
defekt". Das wird wohl daran liegen, dass die Checksumme der wieder
hergestellten Datei geprüft wird und nicht mehr stimmt!

Was muss ich beachten, damit die Checksumme der wieder hergestellten
Datei mit der Originaldatei übereinstimmt?

Code: Alles auswählen


DefaultPacketSize = 50000
SourceFile$       = "C:\irgendwas.datei"
DestinationFile$  = "C:\irgendwas neu.datei"



;Zerstückeln ======================================================

OpenFile(0, SourceFile$)
  
  Size        = Lof(0)
  PacketCount = Size / DefaultPacketSize        ;Paketanzahl ermitteln
  PacketSize  = Size / PacketCount              ;genaue Paketgröße ermitteln
  RestSize    = Size - PacketSize * PacketCount ;den Rest der Datei in einem zus. Paket anlegen

  *mem = AllocateMemory(PacketSize)
  
  For i = 1 To PacketCount
    ReadData(0, *mem, PacketSize)
    OpenFile(i,"c:\Pack" + Str(i) + ".pck")
       WriteData(i,*mem, PacketSize)
    CloseFile(i)
  Next
  
  If restsize > 0
     OpenFile(PacketCount+1,"c:\Pack" + Str(PacketCount+1) + ".pck")
        WriteData(PacketCount+1,*mem, Restsize)
     CloseFile(PacketCount+1)  
  EndIf
  
  FreeMemory(*mem)   
    
CloseFile(0)






;Zusammensetzen ===================================================

OpenFile(0, DestinationFile$)
   
  *mem = AllocateMemory(PacketSize)

   For i = 1 To PacketCount
      OpenFile(i,"c:\Pack" + Str(i) + ".pck") 
         ReadData(i, *mem, PacketSize)
      CloseFile(i)
      WriteData(0,*mem,PacketSize)
   Next
   
   If restsize > 0
      OpenFile(PacketCount+1,"c:\Pack" + Str(PacketCount+1) + ".pck") 
         ReadData(PacketCount+1, *mem, PacketSize)
      CloseFile(PacketCount+1)
      WriteData(0,*mem,Restsize)      
   EndIf
   
  FreeMemory(*mem)    

CloseFile(0)


Verfasst: 12.08.2006 14:20
von Leonhard
Bei downloads von zips ist dies auch meist ein problem.

Kopierst du auch den Anhang?

Verfasst: 12.08.2006 14:21
von Konne
Du solltest ReadFile bzw CreateFile benutzen an deinem Prob arbeite ich noch;) MD5 hash mäßig sind deine Files komplett richtig.
Habe nen Bug gefunden. Wenn die Daten kleiner als ein Cluster sind dividiert er mit 0.

Verfasst: 12.08.2006 14:25
von PBZecke
Konne hat geschrieben:Du solltest ReadFile bzw CreateFile benutzen an deinem Prob arbeite ich noch;) MD5 hash mäßig sind deine Files komplett richtig.
Habe nen Bug gefunden. Wenn die Daten kleiner als ein Cluster sind dividiert er mit 0.
Also mit checksum und hash habe ich mich noch nicht richtig beschäfttigt, wie hast Du das denn geprüft?

Das mit dem Bug ist schon OK, ist noch im Versuchsstadium, trotzdem Danke
für den Hinweis!

Verfasst: 12.08.2006 14:27
von Konne
Also mit Winrar und windows erstellten zip Files gehts prima.

Code: Alles auswählen

Debug MD5FileFingerprint(SourceFile$)
Debug MD5FileFingerprint(DestinationFile$)

Verfasst: 12.08.2006 14:30
von PBZecke
Komisch! Genau ein mit Windows Zip erstelltes File macht zicken! Ist aber
auch groß, 80 MB.

Das andere ist ein NSIS-Installer. Der meckert auch.

Verfasst: 12.08.2006 14:32
von Konne
Komisch vielleicht ist mein windows anders.
Nunja auf jedenfall passt das schon wenn du das nur so machst da wird keiner Meckern.

Verfasst: 12.08.2006 14:37
von PBZecke
Na ja, im Moment spiele ich ja nur damit rum, aber ich wollte das in meine
dll-Sammlung aufnehmen, und da sollte das schon zu 100% funktionieren.

Vieleicht fällt jemanden noch was dazu ein. Auf jeden Fall danke Konne! :)

Wie Dateien richtig splitten (gelöst)

Verfasst: 14.08.2006 22:05
von PBZecke
Habe den Fehler gefunden! Ich habe dummerweise einfach ein ReadData()
beim splitten vergessen! Dadurch wurden ans Ende der wieder
zusammengesetzten Datei zwei mal die gleichen Daten geschrieben.