PDA

Ver la Versión Completa : concatenar ficheros


haron
08-08-2003, 17:18:44
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?

Juliŕ T.
08-08-2003, 19:32:15
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;

jorge1987
12-11-2006, 01:40:48
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 :D:D

seoane
12-11-2006, 14:23:28
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í (http://www.clubdelphi.com/foros/showpost.php?p=160210&postcount=3). 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.


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)


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

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.


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.

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.

jorge1987
12-11-2006, 19:54:43
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 :D:D