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:
cpp
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í:
delphi
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.