Seite 1 von 1

FileSplitter Include

Verfasst: 02.01.2009 11:49
von cxAlex
Hier ein kleines Include um beliebige Dateien zu splitten und wieder zu mergen. Das Include ist eigenlich selbsterklärend, wenn noch Fragen sind, immer her damit:

Code: Alles auswählen

; ------------------------------------------------------------------------------------
; Include: Filesplitter
; Autor: Alexander Aigner
; ------------------------------------------------------------------------------------

EnableExplicit

; ------------------------------------------------------------------------------------
; Internal
; ------------------------------------------------------------------------------------

Macro Mem_Alloc(_mem)
  AllocateMemory(_mem)
EndMacro

Macro Mem_ReAlloc(_mem, _size)
  ReAllocateMemory(_mem, _size)
EndMacro

Macro Mem_Free(_mem)
  FreeMemory(_mem)
EndMacro

Macro FileExists(_File)
  (FileSize(_File)>-1)
EndMacro

Macro CheckDir(_Dir)
  If Mid(_Dir, Len(_Dir), 1)<>"\"
    _Dir + "\"
  EndIf
EndMacro

Macro CheckExtension(_Ext)
  If Left(_Ext, 1) = "."
    _Ext = Mid(_Ext, 2)
  EndIf
EndMacro

; ------------------------------------------------------------------------------------
; Procedures
; ------------------------------------------------------------------------------------

Declare SplittFile(InFile.s, OutDir.s, PartName.s, PartExtension.s, PartSize.q)
Declare MergeFile(InDir.s, PartName.s, PartExtension.s, OutFile.s, DeleteParts = 0)

Procedure SplittFile(InFile.s, OutDir.s, PartName.s, PartExtension.s, PartSize.q)
  Protected File, tFile, Size, Count, i, *mem
  CheckDir(OutDir)
  CheckExtension(PartExtension)
  CreateDirectory(OutDir)
  File = ReadFile(#PB_Any, InFile)
  If File
    Size = Lof(File)
    Count = Round(Size/PartSize, 0)
    For i = 0 To count
      FileSeek(File, i*PartSize)
      *mem = Mem_Alloc(PartSize)
      ReadData(File, *mem, PartSize)
      tFile = CreateFile(#PB_Any, OutDir + PartName + Str(i) + "." + PartExtension)
      If tFile
        If (i + 1)*PartSize>Size
          WriteData(tFile, *mem, PartSize-((i + 1)*PartSize-Size))
        Else
          WriteData(tFile, *mem, PartSize)
        EndIf
        CloseFile(tFile)
      EndIf
      Mem_Free(*mem)
    Next
    CloseFile(File)
    ProcedureReturn i
  EndIf
EndProcedure

Procedure MergeFile(InDir.s, PartName.s, PartExtension.s, OutFile.s, DeleteParts = 0)
  Protected File, tFile, Size, *mem, i
  CheckDir(InDir)
  CheckExtension(PartExtension)
  File = CreateFile(#PB_Any, OutFile)
  If File
    Repeat
      If FileExists(InDir + PartName + Str(i) + "." + PartExtension)
        tFile = ReadFile(#PB_Any, InDir + PartName + Str(i) + "." + PartExtension)
        If tFile
          Size = Lof(tFile)
          *mem = Mem_Alloc(Size)
          ReadData(tFile, *mem, Size)
          CloseFile(tFile)
          If DeleteParts
            DeleteFile(InDir + PartName + Str(i) + "." + PartExtension)
          EndIf
          i + 1
        Else
          Break
        EndIf
        FileSeek(File, Lof(File))
        WriteData(File, *mem, Size)
        Mem_Free(*mem)
      Else
        Break
      EndIf
    ForEver
    CloseFile(File)
  EndIf
EndProcedure

DisableExplicit