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