Posted: Thu Mar 27, 2008 11:38 pm
Inf0byt3, How would I go about adding a procedure to PAK and unPAK a file instead of a folder? 

http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
;With greetz to Rook from Inf0
Procedure PackFile(FilePath.s,PackPath.s,Level.l,*Callback = 0)
;
If *Callback <> 0
PackerCallback(*Callback)
EndIf
;
If FilePath = "" Or PackPath = ""
;
ProcedureReturn 0
;
ElseIf FileSize(FilePath) <= 0
;
ProcedureReturn 0
;
Else
;
FName.s = GetFilePart(FilePath)
;
If CreatePack(PackPath) = 0
ProcedureReturn 0
Else
;
*FileName = AllocateMemory(512) ;enough for the filename (i guess)
If *FileName = 0
ProcedureReturn 0
Else
PokeS(*FileName,FName,Len(FName))
AddPackMemory(*FileName,Len(FName),0)
If AddPackFile(FilePath,Level) = 0
ClosePack()
ProcedureReturn 0
Else
ClosePack()
ProcedureReturn 1
EndIf
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
Procedure UnPackFile(PackFile.s,OutPath.s)
;
If PackFile = "" Or OutPath = ""
;
ProcedureReturn 0
;
Else
;
If Right(OutPath,1) <> "\"
OutPath + "\"
EndIf
If FileSize(OutPath) <> -2
CreateDirectory(OutPath)
EndIf
;
If OpenPack(PackFile) = 0
ProcedureReturn 0
Else
;
*FileName = NextPackFile()
FileNameSize.l = PackFileSize()
File.s = OutPath + PeekS(*FileName)
;
*FileMem = NextPackFile()
FileMemSize.l = PackFileSize()
;
FH = CreateFile(#PB_Any,File)
If IsFile(FH) = 0
ClosePack()
ProcedureReturn 0
Else
WriteData(FH,*FileMem,FileMemSize)
CloseFile(FH)
ClosePack()
ProcedureReturn 1
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
MyFile.s = "C:\ASUSP5K34.jpg"
MyPack.s = "C:\Temp.pck"
MyPath.s = "C:\Out\"
If PackFile(MyFile,MyPack,9)
Debug "packed"
If UnPackFile(MyPack,MyPath)
Debug "unpacked"
Else
Debug "failed to unpack"
EndIf
Else
Debug "failed to pack"
EndIf
Code: Select all
Procedure RC4Mem(Mem.l, memLen.l, Key.s)
;RC4Mem For PB by Pille, 15.07.2003
;Special Thanks to Rings
;Modded by Inf0Byte
Dim S.w(255)
Dim K.w(255)
;A little hack to strenghten it up a bit
KeySha1.s = SHA1Fingerprint(@Key,Len(Key))
For EnhanceKey = 1 To Len(Key)
NewKey.s + Mid(Key,EnhanceKey,1) + KeySha1
Next
Key = NewKey
For i = 0 To 255
S(i) = i
Next
j = 1
For i = 0 To 255
If j > Len(key)
j = 1
EndIf
K(i) = Asc(Mid(key, j, 1))
j = j + 1
Next i
j = 0
For i = 0 To 255
j = (j + S(i) + K(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
Next i
i = 0
j = 0
For x = 0 To memLen-1
i = (i + 1) & 255
j = (j + S(i)) & 255
temp = S(i)
S(i) = S(j)
S(j) = temp
t = (S(i) + (S(j) & 255)) & 255
Y = S(t)
PokeB(Mem+x, PeekB(Mem+x)!Y)
Next
Key = ""
ProcedureReturn Mem
EndProcedure
Procedure PackFile(FilePath.s,PackPath.s,Level.l,Password.s="")
;
If FilePath = "" Or PackPath = ""
;
ProcedureReturn 0
;
ElseIf FileSize(FilePath) <= 0
;
ProcedureReturn 0
;
Else
;
FName.s = GetFilePart(FilePath)
;
If CreatePack(PackPath) = 0
ProcedureReturn 0
Else
;
*FileName = AllocateMemory(512) ;enough for the filename (i guess)
If *FileName = 0
ClosePack()
ProcedureReturn 0
Else
PokeS(*FileName,FName,Len(FName))
AddPackMemory(*FileName,Len(FName),Level)
FileToPack = ReadFile(#PB_Any,FilePath)
If IsFile(FileToPack)
FileLen = Lof(FileToPack)
*FileData = AllocateMemory(FileToPack)
ReadData(FileToPack,*FileData,FileLen)
If Password <> ""
RC4Mem(*FileData,FileLen,Password) ;Encrypt the file data
EndIf
AddPackMemory(*FileData,FileLen,Level)
If *FileData
FreeMemory(*FileData)
EndIf
If *FileName
FreeMemory(*FileName)
EndIf
CloseFile(FileToPack)
ClosePack()
ProcedureReturn 1
Else
If *FileName
FreeMemory(*FileName)
EndIf
ClosePack()
ProcedureReturn 0
EndIf
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
Procedure UnPackFile(PackFile.s,OutPath.s,Password.s="")
;
If PackFile = "" Or OutPath = ""
;
ProcedureReturn 0
;
Else
;
If Right(OutPath,1) <> "\"
OutPath + "\"
EndIf
If FileSize(OutPath) <> -2
CreateDirectory(OutPath)
EndIf
;
If OpenPack(PackFile) = 0
ProcedureReturn 0
Else
;
*FileName = NextPackFile()
FileNameSize.l = PackFileSize()
File.s = OutPath + PeekS(*FileName)
;
*FileMem = NextPackFile()
FileMemSize.l = PackFileSize()
;
FH = CreateFile(#PB_Any,File)
If IsFile(FH) = 0
ClosePack()
ProcedureReturn 0
Else
If Password <> "" ;we need to decrypt the actual data
RC4Mem(*FileMem,FileMemSize,Password)
EndIf
WriteData(FH,*FileMem,FileMemSize)
CloseFile(FH)
ClosePack()
ProcedureReturn 1
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
MyFile.s = "C:\Windows\NOTEPAD.EXE"
MyPack.s = "C:\Temp.pck"
MyPath.s = "C:\Out\"
Password.s = "mypassword" ; use and empty string for no password
If PackFile(MyFile,MyPack,9,Password)
Debug "packed"
If UnPackFile(MyPack,MyPath,Password)
Debug "unpacked"
Else
Debug "failed to unpack"
EndIf
Else
Debug "failed to pack"
EndIf
Very usefull code!Inf0Byt3 wrote:Hmmm that's strange. It works here :/. 843 files and 12 folders, all out. But I think I know why. Notice that some files that are in use/hidden cannot be accessed and also, my code doesn't include empty folders and files. I'm sure that's why it failed to include all the stuff in the folder.
As I said it can be extended and improved, i just needed something quick.
Code: Select all
;With greetz to Rook from Inf0
Procedure PackFile(FilePath.s,PackPath.s,Level.l,*Callback = 0)
;
If *Callback <> 0
PackerCallback(*Callback)
EndIf
;
If FilePath = "" Or PackPath = ""
;
ProcedureReturn 0
;
ElseIf FileSize(FilePath) <= 0
;
ProcedureReturn 0
;
Else
;
FName.s = GetFilePart(FilePath)
;
If CreatePack(PackPath) = 0
ProcedureReturn 0
Else
;
*FileName = AllocateMemory(512) ;enough for the filename (i guess)
If *FileName = 0
ProcedureReturn 0
Else
PokeS(*FileName,FName,Len(FName))
AddPackMemory(*FileName,Len(FName),0)
If AddPackFile(FilePath,Level) = 0
ClosePack()
ProcedureReturn 0
Else
ClosePack()
ProcedureReturn 1
EndIf
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
Procedure UnPackFile(PackFile.s,OutPath.s)
;
If PackFile = "" Or OutPath = ""
;
ProcedureReturn 0
;
Else
;
If Right(OutPath,1) <> "\"
OutPath + "\"
EndIf
If FileSize(OutPath) <> -2
CreateDirectory(OutPath)
EndIf
;
If OpenPack(PackFile) = 0
ProcedureReturn 0
Else
;
*FileName = NextPackFile()
FileNameSize.l = PackFileSize()
File.s = OutPath + PeekS(*FileName)
;
*FileMem = NextPackFile()
FileMemSize.l = PackFileSize()
;
FH = CreateFile(#PB_Any,File)
If IsFile(FH) = 0
ClosePack()
ProcedureReturn 0
Else
WriteData(FH,*FileMem,FileMemSize)
CloseFile(FH)
ClosePack()
ProcedureReturn 1
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
MyFile.s = "C:\ASUSP5K34.jpg"
MyPack.s = "C:\Temp.pck"
MyPath.s = "C:\Out\"
If PackFile(MyFile,MyPack,9)
Debug "packed"
If UnPackFile(MyPack,MyPath)
Debug "unpacked"
Else
Debug "failed to unpack"
EndIf
Else
Debug "failed to pack"
EndIf
Code: Select all
;With greetz to Rook from Inf0
Procedure PackFile(FilePath.s,PackPath.s,Level.l,*Callback = 0)
;
If *Callback <> 0
PackerCallback(*Callback)
EndIf
;
If FilePath = "" Or PackPath = ""
;
ProcedureReturn 0
;
ElseIf FileSize(FilePath) <= 0
;
ProcedureReturn 0
;
Else
;
FName.s = GetFilePart(FilePath)
;
If CreatePack(PackPath) = 0
ProcedureReturn 0
Else
;
*FileName = AllocateMemory(1024) ;enough for the filename (i guess)
If *FileName = 0
ProcedureReturn 0
Else
CompilerIf #PB_Compiler_Unicode
PokeS(*FileName,FName,StringByteLength(FName,#PB_UTF8),#PB_UTF8)
AddPackMemory(*FileName,StringByteLength(FName,#PB_UTF8)+1,0) ;+1 null
CompilerElse
PokeS(*FileName,FName)
AddPackMemory(*FileName,Len(FName)+1,0) ;+1 null
CompilerEndIf
If AddPackFile(FilePath,Level) = 0
ClosePack()
ProcedureReturn 0
Else
ClosePack()
ProcedureReturn 1
EndIf
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
Procedure UnPackFile(PackFile.s,OutPath.s)
;
If PackFile = "" Or OutPath = ""
;
ProcedureReturn 0
;
Else
;
If Right(OutPath,1) <> "\"
OutPath + "\"
EndIf
If FileSize(OutPath) <> -2
CreateDirectory(OutPath)
EndIf
;
If OpenPack(PackFile) = 0
ProcedureReturn 0
Else
;
*FileName = NextPackFile()
FileNameSize.l = PackFileSize()
CompilerIf #PB_Compiler_Unicode
File.s = OutPath + PeekS(*FileName,-1,#PB_UTF8)
CompilerElse
File.s = OutPath + PeekS(*FileName)
CompilerEndIf
Debug file
;
*FileMem = NextPackFile()
FileMemSize.l = PackFileSize()
;
FH = CreateFile(#PB_Any,File)
If IsFile(FH) = 0
ClosePack()
ProcedureReturn 0
Else
WriteData(FH,*FileMem,FileMemSize)
CloseFile(FH)
ClosePack()
ProcedureReturn 1
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
MyFile.s = "C:\texture.bmp"
MyPack.s = "C:\Temp.pck"
MyPath.s = "C:\Out\"
If PackFile(MyFile,MyPack,9)
Debug "packed"
If UnPackFile(MyPack,MyPath)
Debug "unpacked"
Else
Debug "failed to unpack"
EndIf
Else
Debug "failed to pack"
EndIf
Code: Select all
;With greetz to Rook from Inf0
Procedure PackFile(FilePath.s,PackPath.s,Level.l,*Callback = 0)
;
If *Callback <> 0
PackerCallback(*Callback)
EndIf
;
If FilePath = "" Or PackPath = ""
;
ProcedureReturn 0
;
ElseIf FileSize(FilePath) <= 0
;
ProcedureReturn 0
;
Else
;
FName.s = GetFilePart(FilePath)
;
If CreatePack(PackPath) = 0
ProcedureReturn 0
Else
;
*FileName = AllocateMemory(1024) ;enough for the filename (i guess)
If *FileName = 0
ProcedureReturn 0
Else
CompilerIf #PB_Compiler_Unicode
PokeS(*FileName,FName,StringByteLength(FName,#PB_UTF8),#PB_UTF8)
AddPackMemory(*FileName,StringByteLength(FName,#PB_UTF8)+1,0) ;+1 null
CompilerElse
PokeS(*FileName,FName)
AddPackMemory(*FileName,Len(FName)+1,0) ;+1 null
CompilerEndIf
If AddPackFile(FilePath,Level) = 0
ClosePack()
ProcedureReturn 0
Else
ClosePack()
ProcedureReturn 1
EndIf
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
Procedure UnPackFile(PackFile.s,OutPath.s)
;
If PackFile = "" Or OutPath = ""
;
ProcedureReturn 0
;
Else
;
If Right(OutPath,1) <> "\"
OutPath + "\"
EndIf
If FileSize(OutPath) <> -2
CreateDirectory(OutPath)
EndIf
;
If OpenPack(PackFile) = 0
ProcedureReturn 0
Else
;
*FileName = NextPackFile()
FileNameSize.l = PackFileSize()
CompilerIf #PB_Compiler_Unicode
File.s = OutPath + PeekS(*FileName,-1,#PB_UTF8)
CompilerElse
File.s = OutPath + PeekS(*FileName)
CompilerEndIf
Debug file
;
*FileMem = NextPackFile()
FileMemSize.l = PackFileSize()
;
FH = CreateFile(#PB_Any,File)
If IsFile(FH) = 0
ClosePack()
ProcedureReturn 0
Else
WriteData(FH,*FileMem,FileMemSize)
CloseFile(FH)
ClosePack()
ProcedureReturn 1
EndIf
;
EndIf
;
EndIf
;
ProcedureReturn 0
;
EndProcedure
;MyFile.s = "C:\texture.bmp"
MyFile.s = "C:\Program Files\PureBasic\DEVEL\WaHOO\MUSIC\anoy1.ogg"
MyFile2.s = "C:\Program Files\PureBasic\DEVEL\WaHOO\MUSIC\anoy2.ogg"
MyFile3.s = "C:\Program Files\PureBasic\DEVEL\WaHOO\MUSIC\anoy3.ogg"
MyPack.s = "C:\Program Files\PureBasic\DEVEL\WaHOO\Temp.pak"
MyPath.s = "C:\Program Files\PureBasic\DEVEL\WaHOO\SONGS\"
OpenConsole()
If PackFile(MyFile,MyPack,0)
Debug "packed"
PackFile(MyFile2,MyPack,0)
Debug "2nd packed"
PackFile(MyFile3,MyPack,0)
Debug "3rd packed up!"
If UnPackFile(MyPack,MyPath)
Debug "unpacked"
Else
Debug "failed to unpack"
EndIf
Else
Debug "failed to pack"
EndIf
Input()
End