Page 1 sur 1
Créer un gros fichier
Publié : dim. 23/oct./2005 13:59
par Droopy
J'en ai eu besoin pour générer des fichiers de taille déterminée
Code : Tout sélectionner
; Each paquet is 10Mo
; If you want 100Mb File : Block = 10
; The limit is 4Gb file
Procedure CreateBigFile(File.s,Block)
InitBigString()
CreateFile(0,File)
Paquet.s=Space(1024*1024*10) ;/ Each Packet is 10Mb
For n=1 To Block
FileSeek(Lof())
WriteString(Paquet)
Next
CloseFile(0)
FreeBigString()
EndProcedure
;/ Test
#File="c:\Big.bin"
CreateBigFile(#File,10)
MessageRequester(#File,Str(FileSize(#File)/1024/1024)+" Mb")
Publié : dim. 23/oct./2005 14:10
par Anonyme2
c'est quoi le InitBigString() ?
Je suppose que c'est pour définir des chaînes > à 64 Ko

Publié : dim. 23/oct./2005 14:28
par nico
Je ne sais pas pour les autres mais mettre une lib en truc et astuce, c'est pas sa place; met le plutôt en annonce. Surtout que le code est connu en plus.

Publié : dim. 23/oct./2005 15:05
par LeCyb
J'ajoutterais que c'est super chiant de donner des exemples qui utilisent des librairies tierces.
Publié : dim. 23/oct./2005 15:08
par Droopy
Désolé j'ai pas fait attention

Publié : dim. 23/oct./2005 15:11
par Droopy
Voila le code pour gérer les String > 64Ko
Code : Tout sélectionner
;/ Author : BugString by Deeém2031 and PureFan
; You want bigger string than 64000 Kb
; Or just lower memory-usage whether You use small strings?
; Use this: (but don't use the big strings with "Debug",
; the Debugger still have a limit To 64000B)
Structure EXCEPTIONREPORTRECORD
ExceptionCode.l
fHandlerFlags.l
*NestedExceptionReportRecord.EXCEPTIONREPORTRECORD
*ExceptionAddress.l
cParameters.l
ExceptionInfo.l[#EXCEPTION_MAXIMUM_PARAMETERS]
EndStructure
Global BigString_Base, BigString_BaseSize, BigString_OldExceptionHandler
Procedure StringExceptionHandler(*ExceptionInfo.EXCEPTION_POINTERS)
Protected BigString_BaseEnd, tmp
*ExceptionRecord.EXCEPTIONREPORTRECORD = *ExceptionInfo\pExceptionRecord
If *ExceptionRecord\ExceptionCode = #EXCEPTION_ACCESS_VIOLATION
If *ExceptionRecord\cParameters = 2
BigString_BaseEnd = BigString_Base+BigString_BaseSize
If *ExceptionRecord\ExceptionInfo[1]&$FFFFF000 = BigString_BaseEnd-$1000
VirtualProtect_(BigString_BaseEnd-$1000,$1000,#PAGE_READWRITE,@tmp)
If VirtualAlloc_(BigString_BaseEnd,$1000,#MEM_COMMIT,#PAGE_NOACCESS)
BigString_BaseSize+$1000
ProcedureReturn #EXCEPTION_CONTINUE_EXECUTION
EndIf
MessageRequester("Error","Kein Speicher mehr da, der String ist zu groß.",16)
EndIf
EndIf
EndIf
ProcedureReturn CallFunctionFast(BigString_OldExceptionHandler,*ExceptionInfo)
EndProcedure
ProcedureDLL InitBigString()
If BigString_Base
VirtualFree_(BigString_Base, BigString_BaseSize, #MEM_RELEASE)
EndIf
BigString_Base = VirtualAlloc_(#Null,$10000000,#MEM_RESERVE,#PAGE_READWRITE)
If BigString_Base
BigString_BaseSize = $2000
!PUSH dword[PB_StringBase]
!PUSH 0
!PUSH dword[PB_MemoryBase]
!EXTRN _HeapFree@12
!CALL _HeapFree@12
If VirtualAlloc_(BigString_Base,BigString_BaseSize,#MEM_COMMIT,#PAGE_READWRITE)
!MOV dword[PB_StringBase], eax
VirtualProtect_(BigString_Base+(BigString_BaseSize-$1000),$1000,#PAGE_NOACCESS,@tmp)
BigString_OldExceptionHandler = SetUnhandledExceptionFilter_(@StringExceptionHandler())
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
ProcedureDLL FreeBigString()
VirtualFree_(BigString_Base, BigString_BaseSize, #MEM_RELEASE)
SetUnhandledExceptionFilter_(BigString_OldExceptionHandler)
!PUSH 64000
!PUSH 8 ;HEAP_ZERO_MEMORY
!PUSH dword[PB_MemoryBase]
!EXTRN _HeapAlloc@12
!CALL _HeapAlloc@12
!MOV dword[PB_StringBase], eax
EndProcedure
Publié : dim. 23/oct./2005 15:13
par Chris
LeCyb a écrit :J'ajoutterais que c'est super chiant de donner des exemples qui utilisent des librairies tierces.
Je ne vois pas ou est le problème, à partir du moment ou l'exemple n'est pas basé uniquement sur une, (ou plusieurs), des fonctions de la lib.
Par contre, quand un exemple utilise une lib, ce serait bien de le mentionner, et de mettre un lien permettant de la télécharger.
Publié : dim. 23/oct./2005 22:37
par LeCyb
Pour info, normalement la librairie des chaînes devrait subir un solide lifting dans la version 4 (thread-safe etc...).
Sinon pour faire sauter la limite des chaînes y'a nettement plus simple sans changer le code existant, il suffit d'appeler cette procédure (une seule fois) avant toute manipulation de chaîne:
Code : Tout sélectionner
Procedure SetStringManipulationBufferSize(Bytes)
PBStringBase.l = 0
PBMemoryBase.l = 0
!MOV eax, dword [PB_StringBase]
!MOV [esp+4],eax
!MOV eax, dword [PB_MemoryBase]
!MOV [esp+8],eax
HeapReAlloc_(PBMemoryBase, #GMEM_ZEROINIT, PBStringBase, Bytes)
!MOV dword [_PB_StringBase],eax
EndProcedure
Le paramètre est une taille en bytes pour fixer le buffer mémoire.