Home page > Delphi, tips bulk > Miscellaneous > IncStreamFileSize: increase the size of a stream or file

IncStreamFileSize: increase the size of a stream or file

Thursday 25 August 2011, by CapJack

This unit is used to increment the size of a file or an open stream, by adding space at the end, which is filled with a byte of your choice. Nothing is changed in the existing data.

Optionally, if the file does not exist, it is first created with zero length, then incremented, so you get a blank file of the given size.

Compatible with Delphi/Lazarus all versions, all platforms.

I’m not asking anything in return for this work, except a small link to my site if you find it useful and use it in your software.

CapJack.

  1. (*********************************************************)
  2. (***)                                                 (***)
  3. (***)            UNIT IncStreamFileSize;              (***)
  4. (***)                                                 (***)
  5. (*********************************************************)
  6.  
  7. (*********************************************************)
  8. (* Feel free to use it, but at your own risk!            *)
  9. (* À utiliser librement, mais à vos risques et périls !  *)
  10. (* CapJack - http://capjack.fr                           *)
  11. (*********************************************************)
  12.  
  13.  
  14. (*********************************************************)
  15. (***)                                                 (***)
  16. (***)                  INTERFACE                      (***)
  17. (***)                                                 (***)
  18. (*********************************************************)
  19.  
  20. uses Classes;
  21.  
  22.  
  23. // Default size of buffer - Taille du buffer par défaut.
  24. const IncStreamFileSizeDefBufSize = 64*1024;
  25.  
  26. // Default byte for filling - Octet de remplissage par défaut.
  27. const IncStreamFileSizeDefFillByte = 0;
  28.  
  29. (*********************************************************)
  30. (* DTIncStreamSize                                       *)
  31. (* ----------------------------------------------------- *)
  32. (* Increments the size of an open stream                 *)
  33. (* by setting the space created.                         *)
  34. (* ----------------------------------------------------- *)
  35. (* Incrémente la taille d'un flux ouvert                 *)
  36. (* en initialisant l'espace créé.                        *)
  37. (* ----------------------------------------------------- *)
  38. (* Feel free to use it at your own risk!                 *)
  39. (* À utiliser librement, mais à vos risques et périls !  *)
  40. (* - CapJack -                                           *)
  41. (*********************************************************)
  42.  
  43. procedure DTIncStreamSize
  44.         (
  45.         const AStream     : TStream;
  46.               // stream to be treated  -  flux à traiter
  47.         const ALength     : Int64;
  48.               // Length in bytes to add, ignored if <= 0
  49.               // Longueur en octets à ajouter, ignoré si <= 0
  50.         const AFillByte   : Byte = IncStreamFileSizeDefFillByte;
  51.               // Byte to use for filling  -  Octet de remplissage
  52.         const ABufferSize : Int64 = IncStreamFileSizeDefBufSize
  53.               // Buffer size  -  Taille du buffer
  54.         );
  55.  
  56. (*********************************************************)
  57. (* DTIncFileSize                                         *)
  58. (* ----------------------------------------------------- *)
  59. (* Increments the size of a file,                        *)
  60. (* by setting the space created.                         *)
  61. (* ----------------------------------------------------- *)
  62. (* Incrémente la taille d'un fichier,                    *)
  63. (* en initialisant l'espace créé.                        *)
  64. (* ----------------------------------------------------- *)
  65. (* Feel free to use it at your own risk!                 *)
  66. (* À utiliser librement, mais à vos risques et périls !  *)
  67. (* - CapJack -                                           *)
  68. (*********************************************************)
  69.  
  70. procedure DTIncFileSize
  71.         (
  72.         const AFileName   : string;
  73.               // Name of the file  -  Nom du fichier
  74.         const ALength     : Int64;
  75.               // Length in bytes to add, ignored if <= 0
  76.               // Longueur en octets à ajouter, ignoré si <= 0
  77.         const AllowCreate : Boolean = false;
  78.               // Allows file creation
  79.               // Autorise la création du fichier
  80.         const AFillByte   : Byte = IncStreamFileSizeDefFillByte;
  81.               // Byte to use for filling  -  Octet de remplissage
  82.         const ABufferSize : Int64 = IncStreamFileSizeDefBufSize
  83.               // Buffer size  -  Taille du buffer
  84.         );
  85.  
  86.  
  87. (*********************************************************)
  88. (***)                                                 (***)
  89. (***)                IMPLEMENTATION                   (***)
  90. (***)                                                 (***)
  91. (*********************************************************)
  92.  
  93. uses SysUtils;
  94.  
  95. {---------------------------------------------------------}
  96.  
  97. procedure DTIncStreamSize
  98.         (
  99.         const AStream     : TStream;
  100.         const ALength     : Int64;
  101.         const AFillByte   : Byte = IncStreamFileSizeDefFillByte;
  102.         const ABufferSize : Int64 = IncStreamFileSizeDefBufSize
  103.         );
  104.  var lTotalRemaining, lBufferToTake: Int64;
  105.      lBuffer : PByte;
  106.  begin
  107.   if ALength <= 0 then Exit;
  108.   lBuffer := nil;
  109.   try
  110.    AStream.Seek( 0, soFromEnd );
  111.    GetMem( lBuffer, ABufferSize );
  112.    FillChar( lBuffer^, ABufferSize, AFillByte );
  113.    lTotalRemaining := ALength;
  114.    repeat
  115.      if lTotalRemaining > ABufferSize
  116.         then lBufferToTake := ABufferSize
  117.         else lBufferToTake := lTotalRemaining;
  118.      AStream.WriteBuffer( lBuffer^, lBufferToTake );
  119.      dec( lTotalRemaining, lBufferToTake );
  120.    until lTotalRemaining = 0
  121.   finally
  122.    if assigned( lBuffer ) then FreeMem( lBuffer );
  123.   end;
  124.  end;
  125.  
  126. {---------------------------------------------------------}
  127.  
  128. procedure DTIncFileSize
  129.         (
  130.         const AFileName   : string;
  131.         const ALength     : Int64;
  132.         const AllowCreate : Boolean = false;
  133.         const AFillByte   : Byte = IncStreamFileSizeDefFillByte;
  134.         const ABufferSize : Int64 = IncStreamFileSizeDefBufSize
  135.         );
  136.  var lStream   : TFileStream;
  137.      lFileName : string;
  138.  begin
  139.   if ALength <= 0 then Exit;
  140.   lStream := nil;
  141.   lFileName := ExpandFileName( AFileName );
  142.   try
  143.    if not( FileExists( lFileName ) ) and AllowCreate
  144.       then lStream := TFileStream.Create( lFileName,
  145.                                           fmCreate
  146.                                           or fmShareExclusive)
  147.       else lStream := TFileStream.Create( lFileName,
  148.                                           fmOpenReadWrite
  149.                                           or fmShareExclusive);
  150.    DTIncStreamSize( lStream, ALength, AFillByte, ABufferSize);
  151.   finally
  152.    if assigned( lStream ) then lStream.Free;
  153.   end;
  154.  end;
  155.  
  156. {---------------------------------------------------------}
  157.  
  158. END.