Reservar espacio en disco mediante un fichero cambiando su tamaño

On miércoles, 8 de diciembre de 2010 0 comentarios

En ocasiones nos hace falta reservar espacio en el HD en forma de un archivo vacío pero que ocupe cierto espaco en el disco.

En ANSI C disponemos de la función chsize. La API de Windows nos permite realizar la misma operación con archivos reservando tamaño incluso mayor que 4.294.967.295 bytes. En este caso no disponemos de una función directa, así que propongo una como esta:

Código: [Seleccionar]
BOOL SetFileSize(char* FileName, __int64 Size)
{
  bool Result = false;
  LONG Hi = LONG(Size >> 32);
  DWORD Attributes = GetFileAttributes(FileName);
  if(Attributes == -1) Attributes = FILE_ATTRIBUTE_NORMAL;
  SetFileAttributes(FileName, FILE_ATTRIBUTE_NORMAL);
  HANDLE hFile = CreateFile(FileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);
  if(hFile != HANDLE(-1)){
    if(SetFilePointer(hFile, (LONG)Size, &Hi, FILE_BEGIN) != INVALID_SET_FILE_POINTER){
      Result = SetEndOfFile(hFile);
    }
    CloseHandle(hFile);
  }
  SetFileAttributes(FileName, Attributes);
  return Result;
}
 

En delphi sería algo así:

Código: [Seleccionar]
function SetFileSize(FileName: String; Size: int64): boolean;
var
  Hi: DWORD;
  Attributes: DWORD;
  hFile: THandle;
  R: integer;
begin
  Hi:= DWORD(Size shr 32);
  Result:= false;
  Attributes:= GetFileAttributes(PCHAR(FileName));
  if(Attributes = DWORD(-1)) then Attributes:= FILE_ATTRIBUTE_NORMAL;
  SetFileAttributes(PCHAR(FileName), FILE_ATTRIBUTE_NORMAL);
  hFile:= CreateFile(PCHAR(FileName), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);
  if hFile <> THandle(-1) then
  begin
    if SetFilePointer(hFile, DWORD(Size), @Hi, FILE_BEGIN) <> DWORD(-1) then
    begin
      Result:= SetEndOfFile(hFile);
    end;
    CloseHandle(hFile);
  end;
  SetFileAttributes(PCHAR(FileName), Attributes);
end;
 
Esta función trunca o amplia el fichero si existe o lo crea, en caso contrario.

Que le saqueís partido.


Saludos.

0 comentarios:

Publicar un comentario