Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   como asignar el tamaño a un fichero aunque este sea de 0 kb (https://www.clubdelphi.com/foros/showthread.php?t=69476)

kenychy 20-08-2010 16:30:37

como asignar el tamaño a un fichero aunque este sea de 0 kb
 
Necesito saber como mandar a copiar un archivo y que cuando se cree la copia ya tenga el tamaño del archivo ya asignado aunque este todavía no este totalmente copiado.

Lord Delfos 20-08-2010 18:00:11

Mmmhh... Como yo lo veo no hay mucha alternativa...

El sistema va copiando y actualizando a medida que uno escribe, así que si querés que el archivo tenga el tamaño "final" vas a tener que copiar todo.

Así lo he visto en otros programas, el archivo mide 15 MB, pero si por ejemplo sólo se bajaron 20 KB, entonces tenés un archivo con un montón de 00 adentro. Es decir que el programa escribió todos eses ceros antes de escribir los datos (o tiene un buffer que se llena con ceros y con los datos y pues, al guardar a disco guarda todo el buffer).

No me parece que haya manera de hacer lo que querés sin hacer esto de rellenar con ceros...

¿Qué es exactamente lo que estás haciendo? Por ahí podemos llegar a alguna solución.

Saludongos.

kenychy 20-08-2010 18:09:32

Men, estoy haciendo un copiador, y lo que necesito es saber como reservar el espacio para cada archivo, antes de empezar a copiar.

Chris 20-08-2010 18:15:15

Realmente si se puede, dependiendo del sistema de Archivo. La API de NTFS hace esto. Normalmente esta técnica es utilizada para hacer discos virtuales. Creo que deberías buscar en MSDN al respecto.

kenychy 23-08-2010 17:43:17

men donde puedo encontrar informacion de esto.

escafandra 23-08-2010 19:46:43

La función chsize del C te permite cambiar el tamaño de un archivo a voluntad.

El siguiente ejemplo crea un archivo y le da un tamaño de 2000 bytes:

Código:

#include <io.h>
#include <fcntl.h>

void __fastcall TForm1::Button4Click(TObject *Sender)
{
  int f = open("temp.txt", O_CREAT | O_WRONLY);
  chsize(f, 2000);
  close(f);
}


Saludos.

escafandra 24-08-2010 13:11:43

Con la API de Windows permite realizar la misma operación que chsize 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:

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;
}

Esta función trunca o amplia el fichero si existe o lo crea, en caso contrario.

Saludos.

kenychy 31-08-2010 15:35:39

Tio, yo opte por una permuta para delphi, necesito si esta entre tus posibilidades que me traduscas este codigo para delphi

escafandra 31-08-2010 17:34:32

Código 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;


Saludos.

kenychy 19-11-2010 16:45:15

gracias hermano. su ayuda es impresindible.


La franja horaria es GMT +2. Ahora son las 23:16:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi