FileSplitter Include

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

FileSplitter Include

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86