Compress a file

Share your advanced PureBasic knowledge/code with the community.
BackupUser
PureBasic Guru
PureBasic Guru
Posts: 16777133
Joined: Tue Apr 22, 2003 7:42 pm

Compress a file

Post by BackupUser »

Code updated for 5.20+

Restored from previous forum. Originally posted by Franco.

Code: Select all

; (c) 2002 - Franco's template - absolutely freeware
; CompressFile - to be used with UncompressFile() posted here:
; http://www.purebasic.fr/english/viewtopic.php?f=12&t=3736
; Compress the file and attach the unpacked file length to the packed file
; The Timer and the MessageBox is not needed for the main function...

UseZipPacker()

Procedure CompressFile(file2Compress.s)
  If ReadFile(0, file2Compress)
    fileLength = Lof(0)
    *fileBuffer = AllocateMemory(fileLength)
    *compressBuffer = AllocateMemory(fileLength)
    If fileLength And *fileBuffer And *compressBuffer
      ReadData(0, *fileBuffer, fileLength)
      startTimer = GetTickCount_()
      compressedLength = CompressMemory(*fileBuffer, fileLength,
                                        *compressBuffer, fileLength)
      CloseFile(0)
      If compressedLength
        compressionTime = GetTickCount_() - startTimer
        compressedFileName.s = SaveFileRequester("Choose a file to save to:",
                                                 "", "All files | *.*", 0)
        If compressedFileName
          OpenFile(1,compressedFileName)
          WriteLong(1, fileLength)
          WriteData(1, *compressBuffer, compressedLength)
          CloseFile(1)
          MessageRequester("Info", "Compression succeded:" + Chr(10) + Chr(10) + 
                                   "Old size: " + Str(FileLength) + Chr(10) + 
                                   "New size:"+ Str(CompressedLength + 4) + Chr(10) +
                                   "Compression time: " + Str(CompressionTime) + " ms",
                                   #MB_ICONINFORMATION)
          ProcedureReturn 1
        EndIf
      EndIf 
    EndIf
  EndIf
  ProcedureReturn 0
EndProcedure

file2Compress.s = OpenFileRequester("Choose a file to compress",
                                    "", "All files | *.*", 0)
If file2Compress
  If CompressFile(file2Compress) = 0
    MessageRequester("Info", "Something went wrong.", #MB_ICONINFORMATION)
  EndIf
EndIf
Have a nice day...
Franco

Sometimes you have to go a lonely way to accomplish genius things.

Edited by - franco on 02 May 2002 17:57:22