Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Picar un fichero en trozos (https://www.clubdelphi.com/foros/showthread.php?t=54096)

fide 09-03-2008 03:57:10

Picar un fichero en trozos
 
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.

Código Delphi [-]
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 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

Código Delphi [-]
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') ;
~~~~~~~~~~~~~~~~~~~~~~~~~


La franja horaria es GMT +2. Ahora son las 09:55:05.

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