Créer un gros fichier

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Créer un gros fichier

Message 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")
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

c'est quoi le InitBigString() ?

Je suppose que c'est pour définir des chaînes > à 64 Ko :roll:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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. 8O
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

J'ajoutterais que c'est super chiant de donner des exemples qui utilisent des librairies tierces.
Vive le thread-safe !
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Désolé j'ai pas fait attention :oops:
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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 
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message 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.
Vive le thread-safe !
Répondre