Como dividir arquivos em pedaços menores?

Delphi

28/02/2005

Olá galera, gostaria de saber como dividir arquivos grandes (de qualquer extensão) em pedaços menores, ou por quantidade de bytes ou por quantidade de arquivos divididos? Se puderem me passar o código pra estudar, prefiro!


Jc

Jc

Curtidas 0

Respostas

Marcelo Saviski

Marcelo Saviski

28/02/2005

vc podeia tentar abrir o arquivo numa Stream e escrever ewm outras Streams ele por partes, tipo:
const
  MaxFileSize = 50*1024; //50Kb
var
  NomeArquivo, NomeArquivosFilhos: TFileName;
  Arquivo: TStream;
  I, FileSize: Integer;
  Buffer: array[0..MaxFileSize -1] of Byte;
begin
  NomeArquivo := ´ArquivoX´;
  NomeArquivosFilhos := ChangeFileExt(NomeArquivos, ´.parte¬d.dat´);
  I := 1;
  with TFileStream.Create(Arquivo, fmOpenRead or fmShareDenyWrite);  
  try
    while Position < Size do
    begin
      Arquivo := TFileStream.Create(Format(NomeArquivosFilhos, [I]), fmCreate);
      FileSize := MaxFileSize;
      if FileSize > Size - Position then
        FileSize := Size - Position;
      ReadBuffer(Buffer, FileSize);
      Arquivo.WriteBuffer(Buffer, FileSize);
      Arquivo.Free;
      Inc(I);
    end;
  finally
    Free;
  end;
end;


Eu não testei :wink: , então se puder me dizer se funciona


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

28/02/2005

Depois para juntar de volta, vc deveria abrir todos as partes do arquivo e salvar tudo num só devolta


GOSTEI 0
Jc

Jc

28/02/2005

Olá galera... e ai Marcelo, valeu pela força.
Acabei encontrando na net uma ajudinha que caiu perfeitamente (claro que deve ser feitos alguns ajustes).
Vejam ai abaixo:

// Split file / Dividir arquivo { Parametros: FileToSplit: Especificar um arquivo para divisão. SizeofFiles: Especificar o tamanho dos arquivos divididas (em bytes). Progressbar: Especificar a TProgressBar para mostrar o progresso da divisão. Resultado: SplitFile() criará os arquivos FileName.001, FileName.002, FileName.003 e assim por diante, e terão o tamanho em bytes definidos em SizeofFiles. } function SplitFile(FileName: TFileName; SizeofFiles: Integer; ProgressBar: TProgressBar): Boolean; var i: Word; fs, sStream: TFileStream; SplitFileName: String; begin ProgressBar.Position := 0; fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do begin SplitFileName := ChangeFileExt(FileName, ´.´+ FormatFloat(´000´, i)); sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive); try if fs.Size - fs.Position < SizeofFiles then SizeofFiles := fs.Size - fs.Position; sStream.CopyFrom(fs, SizeofFiles); ProgressBar.Position := Round((fs.Position / fs.Size) * 100); finally sStream.Free; end; end; finally fs.Free; end; end;


// Combine files / Juntar arquivos { Parametros: FileName: Especificar o primeiro dos arquivos da divisão (.001) CombinedFileName: Especifique o nome combinado do arquivo (o arquivo a ser salvo) Resultado: CombineFiles() criará um arquivo das divisões informadas. } function CombineFiles(FileName, CombinedFileName : TFileName) : Boolean; var i: integer; fs, sStream: TFileStream; filenameOrg: String; begin i := 1; fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive); try while FileExists(FileName) do begin sStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try fs.CopyFrom(sStream, 0); finally sStream.Free; end; Inc(i); FileName := ChangeFileExt(FileName, ´.´+ FormatFloat(´000´, i)); end; finally fs.Free; end; end;


// Exemplos de uso: procedure TForm1.Button1Click(Sender: TObject); begin SplitFile(´C:\temp\FileToSplit.chm´,1000000, ProgressBar1); end; procedure TForm1.Button2Click(Sender: TObject); begin CombineFiles(´C:\temp\FileToSplit.001´,´H:\temp\FileToSplit.chm´); end;



GOSTEI 0
Delphi32

Delphi32

28/02/2005

Olá! Achei este tópico antigo por pesquisa e tenho algumas dúvidas com relação a esse código postado acima:

1) Como poderia fazer para no primeiro arquivo eu colocar sempre uma identificação no início (cabeçalho) do arquivo. Queria fazer isso porque queria que o programa verificasse se esse era um arquivo válido. E o modo de validação seria procurar por essa indentificação no cabeçalho do primeiro arquivo.

2) E como eu teria que modificar a rotina de juntar os arquivos para na hora de formar o arquivo ele ignorasse a identificação?


GOSTEI 0
POSTAR