Voici un code qui permet de trandformer un fichier en chaine de caractère puis de nouveau en fichier. Cela en codant en Base64, et en utilisant le PackMemory.
Avec le code si dessous, vous selectionnez un fichier et il doit vous faire une copie du fichier juste a côté en rajoutant "New_" au debut du nom. ça marche très bien dans la plus part des cas. Vous pouvez essayé des fichiers texts, des images jpeg etc... mais parfois sur certain fichier j'ai une mechante erreur avec UnPackMemory
voici une image avec laquel j'ai le problème...

Pouvez vous tester et me dire si vous avez la même problème et si jammais vous avez une idée... une solution n'hesitez pas... 2 jours ou je tourne le problème dans tout les sens. j'ai reprogrammé au moins 10 fois depuis zero, j'ai repris des codes du forum etc... et là je ne sais plus quoi faire.
Merci d'avance
Thy
Code : Tout sélectionner
Global FileSize.l
Procedure.s GetBase64StringFromFile(file.s)
; This uses code posted by netmaestro
; http://www.purebasic.fr/english/viewtopic.php?t=32638&highlight=blob
If ReadFile(0, file)
FileSize.l=Lof(0)
*inputbuffer = AllocateMemory(FileSize)
If *inputbuffer
ReadData(0, *inputbuffer, FileSize)
;Pack File
*PackMemory = AllocateMemory(FileSize + 8)
NewFileSize.l=PackMemory(*InputBuffer, *PackMemory, FileSize, 9)
If NewFileSize=0
CopyMemory(*InputBuffer, *PackMemory, FileSize)
NewFileSize=FileSize
EndIf
; The output buffer (*encodedbuffer) needs to be approximately 35% larger than the input buffer
*encodedbuffer = AllocateMemory(MemorySize(*PackMemory)*1.35)
If *encodedbuffer
encodedlength = Base64Encoder(*PackMemory, NewFileSize, *encodedbuffer, MemorySize(*encodedbuffer))
EndIf
CloseFile(0)
FreeMemory(*inputbuffer)
FreeMemory(*PackMemory)
EndIf
EndIf
base64string.s = PeekS(*encodedbuffer)
FreeMemory(*encodedbuffer)
ProcedureReturn base64string
EndProcedure
Procedure DecodeBase64StringAndSaveAsBinary(base64string.s, file.s)
; This uses code posted by netmaestro
; http://www.purebasic.fr/english/viewtopic.php?t=32638&highlight=blob
;modified by Thyphoon replace len to StringByteLength (Unicode compatibility)
*decodedbuffer = AllocateMemory(StringByteLength(base64string))
Base64Decoder(@base64string, StringByteLength(base64string), *decodedbuffer, StringByteLength(base64string)*0.75)
*UnPackBuffer = AllocateMemory(FileSize)
If UnpackMemory(*DecodedBuffer, *UnPackBuffer)<>FileSize
CopyMemory(*DecodedBuffer, *UnPackBuffer, FileSize)
EndIf
OpenFile(0, file)
WriteData(0, *UnPackBuffer, FileSize)
CloseFile(0)
FreeMemory(*UnPackBuffer)
FreeMemory(*decodedbuffer)
EndProcedure
; Select file to add to database
filePath.s = OpenFileRequester("Choose a file", "", "*.*", 0)
base64string.s = GetBase64StringFromFile(filePath)
newfilePath.s = GetPathPart(filePath) + "new_" + GetFilePart(filePath)
DecodeBase64StringAndSaveAsBinary(base64string.s, newfilePath)