Page 1 of 1

CreateFilledFile (CreateSizedFile)

Posted: Fri Jul 07, 2006 12:56 pm
by b1be
Code updated For 5.20+

Code: Select all

Procedure CreateFilledFile(Name.s,fsize.q)
  CreateFile(0,Name)
  FileSeek(0,fsize-1)
  WriteByte(0,0)
  CloseFile(0)
EndProcedure
Test

Code: Select all

CreateFilledFile("Temp.temp",123)
Should create "Temp.temp" with exact size of 123Bytes

dont know if was posted/or was in help ... but it's a Goodie

Posted: Fri Jul 07, 2006 1:25 pm
by Flype
As the PB manual said, you must check the result of CreateFile().
No offense, it's just cleaner this way. :wink:

Code: Select all

Procedure CreateFilledFile(Name.s, fsize.q)
  Protected file.l = CreateFile(#PB_Any, Name)
  If file
    FileSeek(file, fsize-1)
    WriteByte(file, 0)
    CloseFile(file)
    ProcedureReturn #True
  EndIf
EndProcedure

Posted: Fri Jul 07, 2006 1:28 pm
by b1be
none taken ... i still find this usefull tip.. and thanks for posting

Code: Select all

Procedure CreateFilledFile(Name.s, fsize.q) 
  Protected file.l = CreateFile(#PB_Any, Name) 
  If file 
    If fsize<=0
      CloseFile(file)
      ProcedureReturn #True 
    Else
      FileSeek(file, fsize-1) 
      WriteByte(file, 0) 
      CloseFile(file) 
    ProcedureReturn #True 
   EndIf
  EndIf 
EndProcedure
fixed a bug with filesize=0

Posted: Fri Jul 07, 2006 2:55 pm
by Bonne_den_kule
This one is much faster...

Code: Select all

Procedure CreateFilledFile (Filename.s, NewLength.q)
  Define Filehandle.l
  Filehandle = CreateFile_(@Filename, #GENERIC_READ|#GENERIC_WRITE,#FILE_SHARE_READ|#FILE_SHARE_WRITE, #Null, #CREATE_ALWAYS, #FILE_ATTRIBUTE_NORMAL, #Null) 
  If Filehandle
    If SetFilePointer_(Filehandle, NewLength, (@NewLength)+4, #FILE_BEGIN ) 
      If SetEndOfFile_(Filehandle) 
        If CloseHandle_(Filehandle)
        Else 
          ProcedureReturn 0
        EndIf
      Else
        ProcedureReturn 0
      EndIf
    Else
      ProcedureReturn 0
    EndIf 
  Else
    ProcedureReturn 0
  EndIf 
  ProcedureReturn 1
EndProcedure

Posted: Sat Jul 08, 2006 6:24 pm
by dell_jockey
Bonne_den_kule wrote:This one is much faster...

Code: Select all

Procedure CreateFilledFile (Filename.s, NewLength.q)
  Define Filehandle.l
  Filehandle = CreateFile_(@Filename, #GENERIC_READ|#GENERIC_WRITE,#FILE_SHARE_READ|#FILE_SHARE_WRITE, #Null, #CREATE_ALWAYS, #FILE_ATTRIBUTE_NORMAL, #Null) 
  If Filehandle
    If SetFilePointer_(Filehandle, NewLength, (@NewLength)+4, #FILE_BEGIN ) 
      If SetEndOfFile_(Filehandle) 
        If CloseHandle_(Filehandle)
        Else 
          ProcedureReturn 0
        EndIf
      Else
        ProcedureReturn 0
      EndIf
    Else
      ProcedureReturn 0
    EndIf 
  Else
    ProcedureReturn 0
  EndIf 
  ProcedureReturn 1
EndProcedure
Indeed, it's faster, at least when you need it on a Windows box; unfortunately, faster code most of the time is less portable....

Posted: Sat Jul 08, 2006 7:20 pm
by bingo
@dell_jockey

Debug CreateFilledFile("e:\dummy.tmp",$FFFFFFFFF) 8)

Debug CreateFilledFile("e:\dummy.tmp",$FFFFFFFFFF) :shock:

any limitations of SetFilePointer ???

[xp/sp2/ntfs]

Posted: Sat Jul 08, 2006 7:29 pm
by netmaestro
Platform SDK wrote:The SetFilePointer function moves the file pointer of an open file.

This function stores the file pointer in two LONG values. To work with file pointers that are larger than a single LONG value, it is easier to use the SetFilePointerEx function.

Posted: Sun Jul 09, 2006 12:09 pm
by Bonne_den_kule
bingo wrote:@dell_jockey

Debug CreateFilledFile("e:\dummy.tmp",$FFFFFFFFF) 8)

Debug CreateFilledFile("e:\dummy.tmp",$FFFFFFFFFF) :shock:

any limitations of SetFilePointer ???

[xp/sp2/ntfs]
Why are you trying to make a 1000 GB file ? :shock: