Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-08-2010
kenychy kenychy is offline
Miembro
 
Registrado: ago 2010
Posts: 45
Poder: 0
kenychy Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 20-08-2010
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 10
Lord Delfos Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 20-08-2010
kenychy kenychy is offline
Miembro
 
Registrado: ago 2010
Posts: 45
Poder: 0
kenychy Va por buen camino
Men, estoy haciendo un copiador, y lo que necesito es saber como reservar el espacio para cada archivo, antes de empezar a copiar.
Responder Con Cita
  #4  
Antiguo 20-08-2010
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.676
Poder: 12
Chris Va por buen camino
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.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #5  
Antiguo 23-08-2010
kenychy kenychy is offline
Miembro
 
Registrado: ago 2010
Posts: 45
Poder: 0
kenychy Va por buen camino
men donde puedo encontrar informacion de esto.
Responder Con Cita
  #6  
Antiguo 23-08-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 1.881
Poder: 12
escafandra Va camino a la famaescafandra Va camino a la fama
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.
Responder Con Cita
  #7  
Antiguo 24-08-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 1.881
Poder: 12
escafandra Va camino a la famaescafandra Va camino a la fama
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.
Responder Con Cita
  #8  
Antiguo 31-08-2010
kenychy kenychy is offline
Miembro
 
Registrado: ago 2010
Posts: 45
Poder: 0
kenychy Va por buen camino
Tio, yo opte por una permuta para delphi, necesito si esta entre tus posibilidades que me traduscas este codigo para delphi
Responder Con Cita
  #9  
Antiguo 31-08-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 1.881
Poder: 12
escafandra Va camino a la famaescafandra Va camino a la fama
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.
Responder Con Cita
  #10  
Antiguo 19-11-2010
kenychy kenychy is offline
Miembro
 
Registrado: ago 2010
Posts: 45
Poder: 0
kenychy Va por buen camino
gracias hermano. su ayuda es impresindible.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como saber el tamaño de un fichero kenychy C++ Builder 13 19-11-2010 16:46:59
¿Cómo puedo saber el tamaño que debo asignar al buffer? MON___ API de Windows 5 02-02-2008 22:08:02
Como controlar el tamaño de un fichero subido al servidor lazar PHP 7 06-03-2007 01:27:22
Como asignar el tamaño de papel en QuickRep?? AndGaG Impresión 2 02-07-2006 21:51:12
Obtener Todo El Registro De Una Tabla Aunque Aunque Este Agrupado Por 2 Campos agova SQL 6 11-08-2004 15:48:14


La franja horaria es GMT +2. Ahora son las 14:32:57.


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