Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-08-2003
Avatar de haron
haron haron is offline
Miembro
 
Registrado: may 2003
Ubicación: Las Palmas de Gran Canaria
Posts: 310
Poder: 21
haron Va por buen camino
concatenar ficheros

hola, se que en ms-dos hay una forma sencilla de concatener ficheros en uno solo

c:\>copy fuente1.txt+fuente2.txt+...+fuenteN.txt destino.txt

pero se puede hacer lo mismo en delphi?

es decir, existe alguna forma sencilla de hacer lo mismo en delphi?
__________________
“Plantad la semilla de la avaricia en la infértil tierra de la estupidez y obtendreis la bella flor de la mierda”
(Confucio)
Responder Con Cita
  #2  
Antiguo 08-08-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 21
Julià T. Va por buen camino
hola haron, te sirve algo así

Copia el contenido de c:\aa.txt más el de c:\bb.txt a un archivo nuevo lamado c:\cc.txt

procedure TForm1.Button1Click(Sender: TObject);
Var
F1,F2,F3:TFileStream;
Cad:String;
begin
F1:=TFileStream.Create('c:\aa.txt',fmOpenRead+fmShareDenyNone);
F2:=TFileStream.Create('c:\bb.txt',fmOpenRead+fmShareDenyNone);
F3:=TFileStream.Create('c:\cc.txt',fmCreate);
F3.CopyFrom(F1,F1.Size);
F3.CopyFrom(F2,F2.Size);
f1.Free;
f2.Free;
f3.Free;
end;
Responder Con Cita
  #3  
Antiguo 12-11-2006
Avatar de jorge1987
jorge1987 jorge1987 is offline
Miembro
 
Registrado: may 2005
Ubicación: Buenos Aires
Posts: 244
Poder: 19
jorge1987 Va por buen camino
Bueno, supongamos que junte tres archivos:

Una imagen, un ejecutable, y un .Zip

Estan concatenados en un archivo .concat

Como los desconcateno cada uno con su nombre y extension original?

Saludos
Responder Con Cita
  #4  
Antiguo 12-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Si los archivo tienen un tipo conocido, y el formato del propio archivo nos permite determinar su longitud podríamos hacer algo como lo que describí aquí. Pero aun tendríamos el problema de saber su nombre. La única solución es guardar el nombre y la longitud del archivo junto con el propio archivo.

Para empezar vamos a definir un record que nos dará información sobre cada unos de los archivos. Los campos Nombre y Longitud son imprescindibles, pero puedes añadir tantos como quieras: fechas, comentarios, etc. El nombre del archivo no debe superar los 255 caracteres, mas que suficiente ya que solo guardamos el nombre y no la ruta completa.

Código Delphi [-]
type
  TCabecera = packed record
    Nombre: String[255];
    Longitud: int64;
  end;

Por ahora solo vamos a implementar 2 métodos, Agregar y Extraer. Agregar Añade una archivo al archivo "compacto". "Archivo" es la ruta del archivo a agregar y Stream es el Stream al que queremos agregar el archivo. (Utilizamos streams en vez de usar directamente archivos, así podemos escoger si manipular los archivos en disco o en memoria)

Código Delphi [-]
procedure Agregar(Archivo: string; Stream: TStream);
var
  Cabecera: TCabecera;
  FileStream: TFileStream;
begin
  Stream.Seek(0,soFromEnd);
  FileStream:= TFileStream.Create(Archivo,fmOpenRead or fmShareDenyWrite);
  try
    FillChar(Cabecera,Sizeof(Cabecera),0);
    Cabecera.Nombre:= ExtractFileName(Archivo);
    Cabecera.Longitud:= FileStream.Size;
    Stream.Write(Cabecera,Sizeof(Cabecera));
    Stream.CopyFrom(FileStream,0);
  finally
    FileStream.Free;
  end;
end;

Por ejemplo para crear un archivo con tres imágenes jpeg
Código Delphi [-]
var
  Stream: TFileStream;
begin
  Stream:= TfileStream.Create('d:\prueba.concat',fmCreate or fmShareExclusive);
  try
    Agregar('d:\abc.jpg',Stream);
    Agregar('d:\cde.jpg',Stream);
    Agregar('d:\fgh.jpg',Stream);
  finally
    Stream.Free;
  end;
end;

Ahora necesitamos un método para extraer los archivos. Donde "Ruta" es el directorio donde se quieren extraer los archivos (debe existir). Los archivos se extraerán en el directorio indicado, utilizando su nombre original.

Código Delphi [-]
procedure Extraer(Ruta: string; Stream: TStream);
var
  Cabecera: TCabecera;
  FileStream: TFileStream;
begin
  if Copy(Ruta,Length(Ruta),1) <> '\' then
    Ruta:= Ruta + '\';
  Stream.Seek(0,soFromBeginning);
  while Stream.Position < Stream.Size do
  begin
    Stream.Read(Cabecera,Sizeof(Cabecera));
    with TFileStream.Create(Ruta + Cabecera.Nombre,fmCreate or fmShareExclusive) do
    try
      CopyFrom(Stream,Cabecera.Longitud);
    finally
      Free;
    end;
  end;
end;

Por ejemplo si queremos extraer los archivos del ejemplo anterior.
Código Delphi [-]
var
  Stream: TFileStream;
begin
  Stream:= TfileStream.Create('d:\prueba.concat',fmOpenRead or fmShareDenyWrite);
  try
    Extraer('d:\Temp',Stream);
  finally
    Stream.Free;
  end;
end;

Esto es solo el "esqueleto", así que se puede ampliar bastante. Podemos incluir información sobre directorios, una función para listar el contenido, o la posibilidad de extraer un solo archivo, etc, pero todo eso ya depende de lo que quieras hacer. Quizá sea mas rentable usar algún componente de compresión mas profesional, o ya puestos a hacer algo bien utilizar algún estándar como el de los archivos tar, y así hacer nuestra aplicación compatible con otras.
Responder Con Cita
  #5  
Antiguo 12-11-2006
Avatar de jorge1987
jorge1987 jorge1987 is offline
Miembro
 
Registrado: may 2005
Ubicación: Buenos Aires
Posts: 244
Poder: 19
jorge1987 Va por buen camino
Perfecto, es como lei en un post anterior tuyo, es como si me hubieras leido la mente, y la estructura, es justamente, como yo estaba pensado implementarla, gracias por la ayuda, si le agrego algo mas, no te preocupes, que libero los fuentes aqui mismo. :P

Saludos
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 17:14:29.


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
Copyright 1996-2007 Club Delphi