PDA

Ver la Versión Completa : Picar un fichero en trozos


fide
09-03-2008, 03:57:10
Hola. Ante todo saludos para todo el que lea este pors.
Bueno, lo que necesito hacer es algo como lo que hace el WinRar, o sea, picar un archivo en varios trozos mas pequeños. Pero que ese numero este regido por los KB.

Es que tengo que hacer un servicio de actualizacion de antivirus por correo. O sea, un amigo se suscribe a mi servicio. Le doy una aplicacion que le envia un email a mi servidor, y cuando la otra aplicacion en el servidor lo recibe, entre las informaciones que recibe, esta el maximo de adjuntos que puede enviarse por ese correo.

Cuando cojo esto, tengo que picar un fichero en cuantas partes sea necesario para enviarlo sin problemas por el correo que se esta usando para ello.

Por ejemplo, Juan se suscribe. Su correo soporte 400 KB de adjunto. Y mi programa va a enviar una actualizacion que pesa 800 KB. Para ello mi programa calcula que si lo pica en 400, saldran 2 partes y se mandaran sin problemas por ahi.

Ya tengo todos los calculos que hay que realizar, solo necesito algo como esto, por poner ejemplo.


function PicarFichero(Fichero, CarpetaDestino: String; SizeOnKB: Integer): Boolean;


o sea, un, el archivo que voy a cortar, a donde voy a guardar los pedazoz, en cuantos KB picare cada parte de el...

Gracias desde ya mismo...
Saludos!

dec
09-03-2008, 04:15:25
Hola,

Revisa al artículo How to Split and Merge Files using Delphi code (http://delphi.about.com/od/adptips2005/qt/splitfilemerge.htm) de Zarko Gajic.

fide
10-03-2008, 19:49:07
Dec, muchisimas gracias mi amigo. A la verdad que eso esta super good!
Lo revisare para ver si me sirve a la perfeccion...

fide
10-03-2008, 20:48:17
Aqui esta el codigo para los que no tengan acceso a la pagina


procedure SplitFile(FileName : TFileName; FilesByteSize : Integer) ;
// FileName == file to split into several smaller files
// FilesByteSize == the size of files in bytes
var
fs, ss: TFileStream;
cnt : integer;
SplitName: String;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
for cnt := 1 to Trunc(fs.Size / FilesByteSize) + 1 do
begin
SplitName := ChangeFileExt(FileName, Format('%s%d', ['._',cnt])) ;
ss := TFileStream.Create(SplitName, fmCreate or fmShareExclusive) ;
try
if fs.Size - fs.Position < FilesByteSize then
FilesByteSize := fs.Size - fs.Position;
ss.CopyFrom(fs, FilesByteSize) ;
finally
ss.Free;
end;
end;
finally
fs.Free;
end;
end;

Note: a 3 KB file 'myfile.ext' will be split into 'myfile._1', 'myfile._2','myfile._3' if FilesByteSize parameter equals 1024 (1 KB).

procedure MergeFiles(FirstSplitFileName, OutFileName : TFileName) ;
// FirstSplitFileName == the name of the first piece of the split file
// OutFileName == the name of the resulting merged file
var
fs, ss: TFileStream;
cnt: integer;
begin
cnt := 1;
fs := TFileStream.Create(OutFileName, fmCreate or fmShareExclusive) ;
try
while FileExists(FirstSplitFileName) do
begin
ss := TFileStream.Create(FirstSplitFileName, fmOpenRead or fmShareDenyWrite) ;
try
fs.CopyFrom(ss, 0) ;
finally
ss.Free;
end;
Inc(cnt) ;
FirstSplitFileName := ChangeFileExt(FirstSplitFileName, Format('%s%d', ['._',cnt])) ;
end;
finally
fs.Free;
end;
end;

Uso:

Para trozear
SplitFile('c:\UnaImagen.bmp', 1024) ; //picar en archivos de 1 KB.

Para empatar
MergeFiles('C:\UnaImagen._1','C:\UnaImagenEmpatada.bmp') ;
~~~~~~~~~~~~~~~~~~~~~~~~~