tar.bi
Code: Select all
#Include Once "vbcompat.bi"
#Include Once "file.bi"
/' --------------------------------------------
Tar archiving by: bojan.dosen
-------------------------------------------- '/
Function unixTime(y As Integer, m As Integer, d As Integer, h As Integer, min As Integer, s As Integer) As Integer
'' I don't know why but i need subtract 2 hours from original hours
'' Return (DateSerial(y, m, d)-25569)*86400 + h*3600 + min*60 + s
Return (DateSerial(y, m, d)-25569)*86400 + (h-2)*3600 + min*60 + s
End Function
Function checksum(buffer As UByte Ptr) As Integer
Dim As Integer i, chk
For i=0 To 511
If i >= 148 And i < 156 Then
chk += 32
Else
chk += buffer[i]
EndIf
Next
Return chk
End Function
Function getFname(path As String) As String
Return Mid(path, InStrRev(path, "\")+1)
End Function
Type tarFile Field = 1
Private:
fname As String
fmode As String
oid As String
gid As String
fsize As String
ctime As String
csum As String
lid As String
nolf As String
fID As Integer
Public:
Declare Sub createArchive(path As String)
Declare Sub closeArchive()
Declare Sub addFile(path As String, fname As String = "", lid As Integer = 0)
Declare Sub addFolder(folderName As String)
End Type
Sub tarFile.createArchive(path As String)
This.fID = FreeFile()
Open path For Binary As #This.fID
End Sub
Sub tarFile.closeArchive()
Dim As UByte zero
Dim As Integer i
For i=0 To 1023
Put #This.fID,, zero
Next
Close #This.fID
End Sub
Sub tarFile.addFile(path As String, fname As String = "", lid As Integer = 0)
Dim As UByte Ptr header
Dim As Integer i, offs, addfid
Dim As String tmpStr
header = Allocate(512)
For i=0 To 511
header[i] = 0
Next
If lid = 0 Then
addfid = FreeFile()
Open path For Binary As #addfid
EndIf
'' Change \ to /
For i=0 To Len(fname)-1
If Chr(fname[i]) = "\" Then fname[i] = Asc("/")
Next
'' File name
offs = 0
If fname = "" Then
This.fname = getFname(path)
Else
This.fname = fname
EndIf
For i=0 To Len(This.fname)-1
header[offs+i] = This.fname[i]
Next
'' File mode
offs = 100
Select Case lid
Case 0
This.fmode = "100777 "
Case 5
This.fmode = " 40777 "
End Select
For i=0 To Len(This.fmode)-1
header[offs+i] = This.fmode[i]
Next
'' oid
offs = 108
This.oid = " 0 "
For i=0 To Len(This.oid)-1
header[offs+i] = This.oid[i]
Next
'' gid
offs = 116
This.gid = " 0 "
For i=0 To Len(This.gid)-1
header[offs+i] = This.gid[i]
Next
'' File size
offs = 124
Select Case lid
Case 0
This.fsize = Oct(Lof(addfid))
Case 5
This.fsize = "0"
End Select
This.fsize = Space(12-Len(This.fsize)-1) & This.fsize & " "
For i=0 To Len(This.fsize)-1
header[offs+i] = This.fsize[i]
Next
'' Date and time
Dim As String dt = Format(FileDateTime(path), "yyyy/mm/dd hh:mm:ss")
offs = 136
This.ctime = Oct(unixTime(Val(Mid(dt, 1, 4)), Val(Mid(dt, 6, 2)), Val(Mid(dt, 9, 2)), Val(Mid(dt, 12, 2)), Val(Mid(dt, 15, 2)), Val(Mid(dt, 18, 2))))
This.ctime = Space(12-Len(This.ctime)-1) & This.ctime & " "
For i=0 To Len(This.ctime)
header[offs+i] = This.ctime[i]
Next
'' Checksum - on the end
offs = 148
This.csum = Space(7)
For i=0 To Len(This.csum)-1
header[offs+i] = This.csum[i]
Next
'' Link indicator
offs = 156
This.lid = Str(lid)
header[offs] = This.lid[0]
'' Do checksum
offs = 148
This.csum = Oct(checksum(header))
This.csum = Space(7-Len(This.csum)-1) & This.csum & " "
For i=0 To Len(This.csum)-1
header[offs+i] = This.csum[i]
Next
'' Write to file
Select Case lid
Case 0
Dim As UByte Ptr fbuff
Dim As Integer fs512
fs512 = Int((Lof(addfid)-1)/512+1)*512
If fs512 < 0 Then fs512 = 0
fbuff = Allocate(fs512)
Get #addfid,, fbuff[0], Lof(addfid)
Put #This.fID,, header[0], 512
Put #This.fID,, fbuff[0], fs512
DeAllocate(fbuff)
Case 5
Put #This.fID,, header[0], 512
End Select
If lid = 0 Then Close #addfid
DeAllocate(header)
End Sub
Sub tarFile.addFolder(folderName As String)
'' Example folderName: "documents" or "documents/music" if "documents" exists
Dim As Integer i
'' Change \ to /
For i=0 To Len(folderName)-1
If Chr(folderName[i]) = "\" Then folderName[i] = Asc("/")
Next
If Right(folderName, 1) <> "/" Then folderName &= "/"
This.addFile("", folderName, 5)
End Sub
Code: Select all
#include "tar.bi"
Dim As tarFile myArchive
With myArchive
.createArchive("Archive.tar")
.addFile("c:\windows\explorer.exe", "Windows Explorer.exe")
.addFolder("Empty folder")
.addFile("c:\windows\system32\cmd.exe", "Folder with file\Command Prompt.exe")
.closeArchive()
End With